java io 字符,java IO 一 (读写字符串)

示例代码: import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import org.junit.Test;public class TestFileReaderWriter {/** * FileReader类 */@Testpublic void test1() {FileRe

首先扯点别的:真是好记性不如烂笔头啊,关于java的输入输出流真是看一遍忘一遍,每次用的时候还得查看API,也是艰难。除了知道IO可以分为输入流,输出流,字符流,字节流,其他的忘得干干净净的,都还给老师了。所以再看一遍,再把这些基础知识好好整理学习一下。参考:毕向东老师的java视频 今天写的内容 如何创建一个文件并写入字符串。 从一个文件总读取字符串。 在Eclipse中新建一个JavaIo的工程,在工程目录下新建一个read_writer包 新建一个FileWriterDemo.java 用来创建一个文件并写入字符串 package read_writer;import java.io.FileWriter;import java.io.IOException;public class FileWriterDemo {

public static void main(String[] args) {

writeString();

}

/** * 向文件中写入一个字符串 */

private static void writeString() {

FileWriter fw=null;

try {

//在工程的根目录下创建一个FileWriter对象,如果该目录下已有同名文件,旧的文件将被覆盖

fw=new FileWriter("FileWriterDemo.txt",true);

//要被写入的字符串

String str="helloworld";

fw.write(str);

//将数据刷新到目的文件中

fw.flush();

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

if(fw!=null){

//关闭数据流

fw.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}} 运行后,在工程名上右击,点击refresh,就会发现在工程的根目录下出现一个FileWriterDemo.txt,双击打开,就会发现字符串已经被写入。 重点看看上面的几行代码 //创建一个FileWriter对象,如果该目录下已有同名文件,旧的文件将被覆盖

fw=new FileWriter("FileWriterDemo.txt",true); FileWriter的构造函数们,都出来吧,别藏着掖着了。 //通过给定的file创建一个FileWriter对象FileWriter(File file) //通过给定的file创建一个FileWriter对象,第二个参数取值为false:标识向文件中写入覆盖旧的内容.取值为true:接着文件中的内容继续在后面写。FileWriter(File file, boolean append) Constructs a FileWriter object given a File object. //通过给定的文件描述符创建一个FlieWriter对象。我就略了。FileWriter(FileDescriptor fd) //通过字符串文件名创建一个FileWriterFileWriter(String fileName) Constructs a FileWriter object given a file name. //通过字符串文件名创建一个FileWriter,第二个参数取值为false:标识向文件中写入覆盖旧的内容.取值为true:接着文件中的内容继续在后面写。FileWriter(String fileName, boolean append)

选用的时候根据自己的实际需求选择构造函数。 //将字符串写入文件。fw.write(str); write还有几个比较常用的重载方法

// 把字符数组写入文件void write(char[] cbuf) //把字符数组的一部分写入文件。off表示从数组cbuf的什么位置开始写,len表示写入的字符数void write(char[] cbuf, int off, int len) // 把字符串写入文件,就是代码中用到的。write(String str);//写单个字符write(int c); //把字符串的一部分写入文件。off表示从字符串str的什么位置开始写,len表示写入的字符数void write(String str, int off, int len)

下面我来演示一下使用void write(String str, int off, int len) 可能出现的错误。其他代码都没变,就变了一行代码。 String str="helloworld";//就变了这行代码。fw.write(str,5,10); 看看出现的错误的。 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 15 字符串越界。出现这种异常的原因是没有理解void write(String str, int off, int len) 方法的参数的含义。 String str=”helloworld”;长度为10,我从下标为5的位置(w)为起点开始写,然而这时候从起点到字符串末尾(d)的字符的个数是5,而我的第三个参数指定为10.所以肯定越界了,我改成5运行一下,就没错了。这是我遇到过的错误,希望大家注意。 另外,如果你想写入字符串之前换一行,怎么办,可以这样写 String str="\nhelloworld";

fw.write(str); 但是当你写完用记事本打开这个FileWriterDemo.txt文件时,发现没有换行。这是不要怀疑。这是记事本的错。它不能识别”\n”,所以建议你用notePad++,或EditPlus等软件打开使用字节流好还是字符流好?

答案当然是字节流,首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以开发中,字节流使用广泛。

只要是处理纯文本数据,就要优先考虑字符流,除此之外都是用字节流!。 //将数据刷新到目的文件中

fw.flush(); 写数据的时候要记得调用flush()。意思是让写出的内容立即出现在文件中。 写完数据后,注意在finally块中关闭数据流。 if(fw!=null){

//关闭数据流

fw.close();} 读入一个字符串 使用FileReader从我们刚才创建的文件中读取字符串。就很简单了。FileReadDemo.java package read_writer;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class FileReadDemo {

public static void main(String[] args) {

FileReader fr=null;

try {

fr=new FileReader("FileWriterDemo.txt");

int count=0;

char buf[]=new char[1024];

while((count=fr.read(buf))!=-1){

System.out.print(new String(buf,0,count));

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

if(fr!=null){

try {

fr.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}} FileReader的构造函数 //通过指定的文件创建一个FileReader。FileReader(File file)

//通过一个文件描述符创建一个FileReaderFileReader(FileDescriptor fd)

//通过一个字符串形式的文件名创建一个FileReaderFileReader(String fileName) Creates a new FileReader, given the name of the file to read from.

看一看重点代码 int count=0;char buf[]=new char[1024];//循环读取文件中的内容直到文件末尾。while((count=fr.read(buf))!=-1){

//把char数组转化为字符串输出。

System.out.print(new String(buf,0,count));

} 看看这行代码: (count=fr.read(buf))!=-1)。意思就是如果没到文件的末尾 //这个方法把文件中的内容读取到buf数组中,如果到了文件的末尾会返回-1.否则就返回读到的字符的个数。read的其他的重载方法也是类似的。int read(char[] cbuf)

下面的例子展示如何把D盘中的一个文本文件OriginalFile.java复制一份到D盘下命名为Destination.java。 package read_writer;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class CopyFileTest {

public static void main(String[] args) {

copy();

}

private static void copy() {

FileWriter fw = null;

FileReader fr = null;

try {

fr = new FileReader("D:/OriginalFile.java");

fw = new FileWriter("D:/Destination.java");

char[] buf = new char[1024];

int len = 0;

while ((len = fr.read(buf)) != -1) {

fw.write(buf, 0, len);

fw.flush();

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fw != null) {

try {

fw.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (fr != null) {

try {

fr.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}} 行,差不多到结尾了。休息一下。有错误和疑问欢迎指出,感激不尽。 下一篇文章链接 java IO 二(字符流缓冲区)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public static String loadAFileToStringDE1(File f) throws IOException { long beginTime = System.currentTimeMillis(); InputStream is = null; String ret = null; try { is = new BufferedInputStream( new FileInputStream(f) ); long contentLength = f.length(); ByteArrayOutputStream outstream = new ByteArrayOutputStream( contentLength > 0 ? (int) contentLength : 1024); byte[] buffer = new byte[4096]; int len; while ((len = is.read(buffer)) > 0) { outstream.write(buffer, 0, len); } outstream.close(); ret = outstream.toString(); //byte[] ba = outstream.toByteArray(); //ret = new String(ba); } finally { if(is!=null) {try{is.close();} catch(Exception e){} } } long endTime = System.currentTimeMillis(); System.out.println("方法1用时"+ (endTime-beginTime) + "ms"); return ret; } public static String loadAFileToStringDE2(File f) throws IOException { long beginTime = System.currentTimeMillis(); InputStream is = null; String ret = null; try { is = new FileInputStream(f) ; long contentLength = f.length(); byte[] ba = new byte[(int)contentLength]; is.read(ba); ret = new String(ba); } finally { if(is!=null) {try{is.close();} catch(Exception e){} } } long endTime = System.currentTimeMillis(); System.out.println("方法2用时"+ (endTime-beginTime) + "ms"); return ret; } public static String loadAFileToStringDE3(File f) throws IOException { long beginTime = System.currentTimeMillis(); BufferedReader br = null; String ret = null; try { br = new BufferedReader(new FileReader(f)); String line = null; StringBuffer sb = new StringBuffer((int)f.length()); while( (line = br.readLine() ) != null ) { sb.append(line).append(LINE_BREAK); } ret = sb.toString(); } finally { if(br!=null) {try{br.close();} catch(Exception e){} } } long endTime = System.currentTimeMillis(); System.out.println("方法3用时"+ (endTime-beginTime) + "ms"); return ret; } 3个方法去取一个大于50M的文件,当不设置jvm参数时都OutofMemery,当设置-Xmx128M时。只有方法3 可以通过,设置到-Xmx256M时也只有方法3可以通过,干脆设置512M,都可以了,运行时间如果正常的话一般都在4~5S

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值