文本输入与输出
如何读入文本输入
- 最简单的处理任意文本的方式就是构建Scanner对象(可以用任何输入流构建Scanner对象):
import java.util.Scanner;
import java.nio.file.Paths;
Scanner in = new Scanner(Paths.get(path),charsetName);
import java.io.File;
Scanner in = new Scanner(new File(path),charsetName);
构造方法
Scanner(File source)
构造一个从给定文件读取数据的Scanner.
Scanner(File source, String charsetName)
构造一个从给定文件读取数据的Scanner,并指定编码方式
Scanner(InputStream source)
构造一个从指定的输入流扫描的Scanner,
Scanner(InputStream source, String charsetName)
构造一个从指定的输入流扫描的Scanner,并指定编码方式
Scanner(Readable source)
构造一个从指定源扫描的Scanner
Scanner(ReadableByteChannel source)
构造一个从指定信道扫描的Scanner
Scanner(ReadableByteChannel source, String charsetName)
构造一个从指定信道扫描的Scanner,并指定编码方式
Scanner(String source)
构造一个从给定字符串读取数据的Scanner.
| 构造方法 | |
|---|---|
Scanner(File source) 构造一个从给定文件读取数据的Scanner. |
|
Scanner(File source, String charsetName) 构造一个从给定文件读取数据的Scanner,并指定编码方式 |
|
Scanner(InputStream source) 构造一个从指定的输入流扫描的Scanner, |
|
Scanner(InputStream source, String charsetName) 构造一个从指定的输入流扫描的Scanner,并指定编码方式 |
|
Scanner(Readable source) 构造一个从指定源扫描的Scanner |
|
Scanner(ReadableByteChannel source) 构造一个从指定信道扫描的Scanner |
|
Scanner(ReadableByteChannel source, String charsetName) 构造一个从指定信道扫描的Scanner,并指定编码方式 |
|
Scanner(String source) 构造一个从给定字符串读取数据的Scanner. | |
- 或者,处理短小的文本可以像下面这样读入到一个字符串中:
import java.nio.file.Files;
String content =new String(Files.readAllBytes(path),charsetName);
- 如果想要将这个文件一行行地读入,那么可以调用:
import java.nio.file.Files;
List<String> lines = Files.readAllLines(path,cahrsetName);
- 如果文件太大,那么可以将行惰性处理为一个Stream<String>对象:
{
. . .
}
- 在早期的Java版本中,处理文本输入的唯一方式就是通过BufferedReader类,它的readLine方法会产生一行文本,或者在无法获得更多的输入时返回null。典型的输入循环看起来像下面这样:
InputStream inputStream = . . .;
try(BufferedReader in =new BufferedReader(
new InputStreamReader(
inputStream,charsetName)))
{
String line;
while((line=in.readLine()) != null){
do something with line
}
}
如今,BufferedReader类又有了一个lines方法,可以产生一个Stream<String>对象,但与Scanner不同的是,BufferedReader没有用于任何读入数字的方法。
如何写出文本输出
- 可以使用PrintWriter
- 构造函数,接收四种类型的值:
- 字节输出流 //不需要使用OutputStreamWriter进行字节流字符流转换
- 字符输出流
- 字符串路径 //便捷方法
- File对象
构造方法摘要 PrintWriter(File file)
使用指定文件创建不具有自动行刷新的新 PrintWriter。PrintWriter(File file, String csn)
创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。PrintWriter(OutputStream out)
根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。PrintWriter(OutputStream out, boolean autoFlush)
通过现有的 OutputStream 创建新的 PrintWriter。PrintWriter(String fileName)
创建具有指定文件名称且不带自动行刷新的新 PrintWriter。PrintWriter(String fileName, String csn)
创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。PrintWriter(Writer out)
创建不带自动行刷新的新 PrintWriter。PrintWriter(Writer out, boolean autoFlush)
创建新 PrintWriter。
- 这个类拥有以文本格式打印字符串和数字的方法,它还有一个将PrintWriter链接到FileWriter的便捷方法,
PrintWriter out = new PrintWriter("test.txt","UTF-8");
等同于:
PrintWriter out = new PrintWriter(
new FileOutputStream("test.txt"),"UTF-8");
- 这个类拥有以文本格式打印字符串和数字的方法,为了打印到写出器,需要使用与System.out相同的print,println,printf方法
- 如果写出器设置为自动冲刷模式,那么只要println被调用,缓冲区中的所有字符都会被发送到他们的目的地(PrintWriter自带缓冲区/*将会在以后更新:)*/),默认情况下,自动冲刷模式是禁用的,也可以通过以下方式来启用:
- print方法不抛出异常,可以通过调用checkError()来检查错误:
如果产生格式化/输出错误,返回true。一旦这个流碰到了错误,它就受到了污染,所有对checkError的调用都将返回true。
API:java.io.PrintWriter1.1
PrintWriter(Writer out)
PrintWriter(Whiter writer)
创建一个给定的写出器(Writer)写出新的PrintWriter.
PrintWriter(String filename,String encoding)
PrintWriter(File file,String encoding)
创建一个使用给定的编码方式向给定的文件写出新的PrintWriter。
文件路径与字符编码
- 当指定一个相对文件名时,例如"myfile.txt","mydirectory/myfile.txt",文件位于JAVA虚拟机启动路径的相对位置
System.getProperty("user.dir");
//得到JAVA虚拟机启动路径的相对位置
- 命令行方式下启动路径就是命令解释器的当前路径
- 如果使用集成开发环境,则启动路径由IDE控制
- 以上变量charset的获得方式可以是(不包括Scanner)(以设置utf-8为例):
import java.nio.charset.StandardCharsets;
StandardCharsets.UTF_8 //StandardCharset类具有类型为Charset的静态变量
import java.nio.charset.Charset;
Charset.forName("UTF-8") //静态方法forName返回一个字符串对应的Charset对象
//这个方法可以用来获得StandardCharsets之外的编码方式的Charset
Charset.defaultCharset(); //静态方法
//可以使用这种方式返回平台使用的编码方式
Charset.availableCharsets //静态方法
//这个方法可以用来获得StandardCharsets之外的编码方式的Charset
Charset.defaultCharset(); //静态方法
//可以使用这种方式返回平台使用的编码方式
Charset.availableCharsets //静态方法
//返回所有可用的Charset实例,返回的结果为 字符集的规范名称-Charset对象的映射表
注:不指定编码方式,有些方法会使用默认的平台编码方式(例如String(byte[])构造器),有些方法会使用UTF-8(例如Files.readAllLines)。
最后
本文只供学习交流之用,尊重他人劳动成果,转载请注明出处。
Comments
Post a Comment