java標準輸入輸出重定向(java中的重定向)

本文目錄一覽:

java重定向標準輸出流到當前目錄的log.txt文件,並輸出如下語句:

package com.kidd.atmtest;

import java.io.FileNotFoundException;

import java.io.PrintStream;

import java.text.SimpleDateFormat;

import java.util.Date;

public class Test {

    public static void main(String[] args) throws FileNotFoundException {

        System.out.println(“log.txt文件位置:”

                + Thread.currentThread().getContextClassLoader()

                        .getResource(“log.txt”).getFile());

        System.setOut(new PrintStream(Thread.currentThread()

                .getContextClassLoader().getResource(“log.txt”).getFile()));

        System.out.println(“This is a log file.”);

        System.out

                .println(“****************************************************”);

        System.out.println(“Time:”

                + new SimpleDateFormat(“yyyy.MM.dd HH:mm:ss”)

                        .format(new Date()));

        System.out.println(“Now system is running well.”);

        System.out.println(“My name is Test.”);

    }

}

Java 輸出重定向!

這是輸出重定向,不是加在源代碼中,而是在命令行運行時使用

作用是將輸出寫到指定文件中

如果你是在eclipse中運行,可以在運行配置中設置要輸出的文件名

java怎麼輸出?

java控制台輸出由print( ) 和 println( )來完成最為簡單。這兩種方法由rintStream(System.out引用的對象類型)定義。儘管System.out是一個位元組流,用它作為簡單程序的輸出是可行的。因為PrintStream是從OutputStream派生的輸出流,它同樣實現低級方法write(),write()可用來向控制台寫數據。PrintStream 定義的write( )的最簡單的形式如下:

void write(int byteval)

該方法按照byteval指定的數目向文件寫位元組。儘管byteval 定義成整數,但只有低位的8個位元組被寫入。下面的短例用 write()向屏幕輸出字元「A」,然後是新的行。

// Demonstrate System.out.write().

class WriteDemo {

public static void main(String args[]) {

int b;

b = ‘A’;

System.out.write(b);

System.out.write(‘\n’);

}

}

一般不常用write()來完成向控制台的輸出(儘管這樣做在某些場合非常有用),因為print()和println() 更容易用。

四、PrintWriter類

儘管Java允許用System.out向控制台寫數據,但建議僅用在調試程序時或在常式中。對於實際的程序,Java推薦的向控制台寫數據的方法是用PrintWriter流。PrintWriter是基於字元的類。用基於字元類向控制台寫數據使程序更為國際化。PrintWriter定義了多個構造函數,這裡所用到的一個如下:

PrintWriter(OutputStream outputStream, boolean flushOnNewline)

outputStream是OutputStream類的對象,flushOnNewline控制Java是否在println()方法被調用時刷新輸出流。如果flushOnNewline為true,刷新自動發生,若為false,則不發生。

PrintWriter支持所有類型(包括Object)的print( )和println( )方法,這樣,就可以像用ystem.out那樣用這些方法。如果遇到不同類型的情況,PrintWriter方法調用對象的toString()方法並列印結果。用PrintWriter向外設寫數據,指定輸出流為System.out並在每一新行後刷新流。例如這行代碼創建了與控制台輸出相連的PrintWriter類。

PrintWriter pw = new PrintWriter(System.out, true);

下面的應用程序說明了用PrintWriter處理控制台輸出的方法:

// Demonstrate PrintWriter

import java.io.*;

public class PrintWriterDemo {

public static void main(String args[]) {

PrintWriter pw = new PrintWriter(System.out, true);

pw.println(“This is a string”);

int i = -7;

pw.println(i);

double d = 4.5e-7;

pw.println(d);

}

}

該程序的輸出如下:

This is a string

-7

4.5E-7

io包支持Java的基本I/O(輸入/輸出)系統,包括文件的輸入/輸出。對輸入/輸出的支持是來源於Java的內核API庫,而不是語言關鍵字。

一、輸入/輸出基礎

很多實際的Java應用程序不是基於文本的控制台程序。儘管基於文本的程序作為教學實例是很出色的,它們無法勝任JAVA在實際中的重要應用。Java對外設輸入/輸出的支持也是有限的,並且用起來有些笨拙——甚至是在簡單的例子程序中。基於文本的控制台輸入/輸出對於Java程序並不是十分重要。

Java 提供了與文件和網路相關的強大的和靈活的輸入/輸出支持,Java的輸入/輸出系統是緊密相連並且是具有一致性的。

1.1 流的概念

Java程序通過流來完成輸入/輸出。流是生產或消費信息的抽象。流通過Java的輸入/輸出系統與物理設備鏈接。儘管與它們鏈接的物理設備不盡相同,所有流的行為具有同樣的方式。這樣,相同的輸入/輸出類和方法適用於所有類型的外部設備。這意味著一個輸入流能夠抽象多種不同類型的輸入:從磁碟文件,從鍵盤或從網路套接字。同樣,一個輸出流可以輸出到控制台,磁碟文件或相連的網路。流是處理輸入/輸出的一個潔凈的方法,例如它不需要代碼理解鍵盤和網路的不同。Java中流的實現是在java.io包定義的類層次結構內部的。

1.2 位元組流和字元流

要使用流類,必須導入Java.io包。Java 2 定義了兩種類型的流:位元組類和字元類。位元組流(byte stream)為處理位元組的輸入和輸出提供了方便的方法。例如使用位元組流讀取或書寫二進位數據。字元流(character stream)為字元的輸入和輸出處理提供了方便。它們採用了統一的編碼標準,因而可以國際化。在某些場合,字元流比位元組流更有效。在最底層,所有的輸入/輸出都是位元組形式的。基於字元的流只為處理字元提供方便有效的方法。下面是對位元組流和字元流的概述。

1.2.1 位元組流類

位元組流由兩個類層次結構定義。在頂層有兩個抽象類:InputStream 和 OutputStream。每個抽象類都有多個具體的子類,這些子類對不同的外設進行處理,例如磁碟文件,網路連接,甚至是內存緩衝區。位元組流類顯示於表1-1中。

表1-1 位元組流類

流類 含義

BufferedInputStream緩衝輸入流

BufferedOutputStream緩衝輸出流

ByteArrayInputStream從位元組數組讀取的輸入流

ByteArrayOutputStream向位元組數組寫入的輸出流

DataInputStream包含讀取Java標準數據類型方法的輸入流

DataOutputStream包含編寫Java標準數據類型方法的輸出流

FileInputStream讀取文件的輸入流

FileOutputStream寫文件的輸出流

FilterInputStream實現InputStream

FilterOutputStream實現OutputStream

InputStream描述流輸入的抽象類

OutputStream描述流輸出的抽象類

PipedInputStream輸入管道

PipedOutputStream輸出管道

PrintStream包含print()和println()的輸出流

PushbackInputStream 支持向輸入流返回一個位元組的單位元組的「unget」的輸入流

RandomAccessFile支持隨機文件輸入/輸出

SequenceInputStream兩個或兩個以上順序讀取的輸入流組成的輸入流

抽象類InputStream 和 OutputStream定義了實現其他流類的關鍵方法。最重要的兩種方法是read()和write(),它們分別對數據的位元組進行讀寫。兩種方法都在InputStream 和OutputStream中被定義為抽象方法。它們被派生的流類重載。

1.2.2 字元流類

字元流類由兩個類層次結構定義。頂層有兩個抽象類:Reader和Writer。這些抽象類處理統一編碼的字元流。Java中這些類含有多個具體的子類。字元流類如表1-2所示。

表1-2 字元流的輸入/輸出類

抽象類Reader和Writer定義了幾個實現其他流類的關鍵方法。其中兩個最重要的是read()和write(),它們分別進行字元數據的讀和寫。這些方法被派生流類重載。

1.3 預定義流

所有的Java程序自動導入java.lang包。該包定義了一個名為System的類,該類封裝了運行時環境的多個方面。System 同時包含三個預定義的流變數,in,out和err。這些成員在System中是被定義成public 和static型的,這意味著它們可以不引用特定的System對象而被用於程序的其他部分。

System.out是標準的輸出流。默認情況下,它是一個控制台。System.in是標準輸入,默認情況下,它指的是鍵盤。System.err指的是標準錯誤流,它默認是控制台。然而,這些流可以重定向到任何兼容的輸入/輸出設備。System.in 是inputStream的對象;System.out和System.err是PrintStream的對象。它們都是位元組流,儘管它們用來讀寫外設的字元。但可以用基於字元的流來包裝它們。

二、讀取控制台輸入

在Java 1.0中,完成控制台輸入的惟一途徑是位元組流,使用該方法的老代碼依然存在。今天,運用位元組流讀取控制台輸入在技術上仍是可行的,但這樣做需要用到不被贊成的方法,這種做法不值得推薦。Java 2中讀取控制台輸入的首選方法是字元流,它使程序容易符合國際標準並且易於維護。

Java沒有像標準C的函數scanf()或C++輸入操作符那樣的統一的控制台輸入方法。Java中,控制台輸入由從System.in讀取數據來完成。為獲得屬於控制台的字元流,在BufferedReader對象中包裝System.in。BufferedReader 支持緩衝輸入流查看批註。它最常見的構造函數如下:

BufferedReader(Reader inputReader)

這裡,inputReader是鏈接被創建的BufferedReader實例的流。Reader是一個抽象類。它的一個具體的子類是InputStreamReader,該子類把位元組轉換成字元查看批註。為獲得鏈接System.in的一個InputStreamReader的對象,用下面的構造函數:

InputStreamReader(InputStream inputStream)

因為System .in引用了InputStream 類型的對象,它可以用於inputStream。綜上所述,下面的一行代碼創建了與鍵盤相連的BufferedReader對象。

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

當該語句執行後,br是通過System.in生成的鏈接控制台的字元流。

2.1 讀取字元

從BufferedReader讀取字元,用read()。這裡所用的read()版本如下:

int read( ) throws IOException

該方法每次執行都從輸入流讀取一個字元然後以整型返回。當遇到流的末尾時它返回-1。可以看到,它要引發一個IOException異常。下面的常式演示了read()方法,從控制台讀取字元直到用戶鍵入「q」:

// Use a BufferedReader to read characters from the console.

import java.io.*;

class BRRead {

public static void main(String args[])

throws IOException

{

char c;

BufferedReader br = new

BufferedReader(new InputStreamReader(System.in));

System.out.println(“Enter characters, ‘q’ to quit.”);

// read characters

do {

c = (char) br.read();

System.out.println(c);

} while(c != ‘q’);

}

}

下面是程序運行:

Enter characters, ‘q’ to quit.

123abcq

1

2

3

a

b

c

q

2.2 讀取字元串

從鍵盤讀取字元串,使用readLine()。它是BufferedReader 類的成員。它的通常形式如下:

String readLine( ) throws IOException

它返回一個String對象。下面的例子闡述了BufferedReader類和readLine()方法;程序讀取和顯示文本的行直到鍵入「stop」:

// Read a string from console using a BufferedReader.

import java.io.*;

class BRReadLines {

public static void main(String args[])

throws IOException

{

// create a BufferedReader using System.in

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

String str;

System.out.println(“Enter lines of text.”);

System.out.println(“Enter ‘stop’ to quit.”);

do {

str = br.readLine();

System.out.println(str);

} while(!str.equals(“stop”));

}

}

下面的常式生成了一個小文本編輯器。它創建了一個String對象的數組,然後依行讀取文本,把文本每一行存入數組。它將讀取到100行或直到按「stop」才停止。該例運用一個BufferedReader類來從控制台讀取數據。

// A tiny editor.

import java.io.*;

class TinyEdit {

public static void main(String args[])

throws IOException

{

// create a BufferedReader using System.in

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

String str[] = new String[100];

System.out.println(“Enter lines of text.”);

System.out.println(“Enter ‘stop’ to quit.”);

for(int i=0; i100; i++) {

str[i] = br.readLine();

if(str[i].equals(“stop”)) break;

}

System.out.println(“\nHere is your file:”);

// display the lines

for(int i=0; i100; i++) {

if(str[i].equals(“stop”)) break;

System.out.println(str[i]);

}

}

}

下面是輸出部分:

Enter lines of text.

Enter 『stop』 to quit.

This is line one.

This is line two.

Java makes working with strings easy.

Just create String objects.

stop

Here is your file:

This is line one.

This is line two.

Java makes working with strings easy.

Just create String objects.

java中的標準輸入指的是System.in還是鍵盤輸入?概念搞不太清楚,用Scanner類從鍵盤輸入算是標準輸入嗎?

先理清一些概念:

每個控制台程序都有標準輸入、標準輸出、標準錯誤輸出三個管道(句柄),這三個管道都可以重定向(即改變與管道關聯的對象)。而標準輸入默認是與鍵盤關聯的(即從鍵盤獲取輸入),標準輸出和標準錯誤輸出默認是與顯示器相關聯的(即把數據和錯誤輸出到顯示器)。所以,從鍵盤輸入不一定是標準輸入(比如把數據輸入到文本框也要用鍵盤,但這不叫標準輸入,並不是所有的程序都有上面說的那3個管道),只有通過與標準輸入管道關聯的對象進行的輸入才叫標準輸入。

其次:

java把標準輸入管道封裝到了System.in(它是一個輸入流對象,它包含了一個管道對象),所以可以說通過System.in進行的輸入是標準輸入,而Scanner只是對這個輸入流對象的再一次封裝,只要System.in沒重定向,那用Scanner類從鍵盤輸入當然也算是標準輸入。

java 程序調用 輸出重定向

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.SequenceInputStream;

public class Processing

{

public static void main(String[] args)

{

try

{

Process process = Runtime.getRuntime().exec(“cmd”);

SequenceInputStream sis = new SequenceInputStream(process.getInputStream(), process.getErrorStream());

InputStreamReader isr = new InputStreamReader(sis, “GBK”);

BufferedReader br = new BufferedReader(isr);

// next command

OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream());

BufferedWriter bw = new BufferedWriter(osw);

bw.write(“cd /d d:/test”);

bw.newLine();

bw.write(“javac prog1.java  javac.txt”);

bw.newLine();

bw.write(“java prog1  java.txt”);

bw.newLine();

bw.flush();

bw.close();

osw.close();

// read

String line = null;

while(null != (line = br.readLine()))

{

System.out.println(line);

}

process.destroy();

br.close();

isr.close();

}

catch(IOException e)

{

e.printStackTrace();

}

}

}

原創文章,作者:GJETW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330562.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GJETW的頭像GJETW
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論