黑马程序员技术交流社区
标题:
IO流day18和day19有几个不是很明白。
[打印本页]
作者:
王德升
时间:
2012-7-5 17:59
标题:
IO流day18和day19有几个不是很明白。
一:
import java.io.*;
class FileReader
{
public static void main(String[] args)
{
FileReader fr = null;
try
{
fr = new FileReader("nihao.txt");
char[] c = new char[1024];//1024又是怎么定义的?求详细,
//上次了问了不是很清楚,希望详细点。谢谢
int num = 0;
while((num = fr.read(c))!=-1)
{
System.out.println(new String(c,0,num));
}
}
catch(IOException e)
{
System.out.println("catch:"+e.toString());//throw new IOException("出错了");我这里这样抛为什么不对啊,该怎么抛。
}
finally
{
try
{
if(fr!=null)
fr.close();
}
catch(IOException e)
{
System.out.println("catch:"+e.toString());//这里的new String是将数组c变成字符串,
//为什么这么new,是String的构造函数?
}
}
}
}
二:
public static void copy_1()throws IOException
{
//创建目的地。
FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");
//与已有文件关联。
FileReader fr = new FileReader("RuntimeDemo.java");
int ch = 0;
while((ch=fr.read())!=-1)
{
fw.write(ch);
}
fw.close();
fr.close();
}
这是day18将C盘一个文本文件复制到D盘。
首先要明确目的地,这跟我可以理解的因为要先有目的地然后才可以复制过去,
可是下面day19通过缓冲区复制一个文件,为什么它没有先明确目的而是先创建了
与文件关联的流,这是为什么???
/*
通过缓冲区复制一个.java文件。
*/
import java.io.*;
class CopyTextByBuf
{
public static void main(String[] args)
{
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{
bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
String line = null;
while((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
}
}
}
作者:
赵庆礼
时间:
2012-7-5 18:21
这里的new String是将数组c变成字符串,为什么这么new,是String的构造函数?
new String(c, 0, len)是构造一个新的 String对象,其字符长度为len个,。在这里是为了防止fr.read(c)在最后一次读取的时候,存入的字符并不是数组c的大小1024,而存入的字符个数len是小于1024的情况下,那么这个数组第len个之后的字符是没有被替换的,是上次读取时存入的字符,当在构造String对象时,会把整个数组c中的字符全部放写入String对象,出现错所。
至于,,可是下面day19通过缓冲区复制一个文件,为什么它没有先明确目的而是先创建了
与文件关联的流,这是为什么???
其实这个也是先创建了与目的文件相关的流,
bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
这段代码的是把FileWriter创建的匿名对象走位参数传递给了new BufferedWriter(),创建了字符输出流BufferedWriter对象,
希望这些可以帮助你
作者:
王德升
时间:
2012-7-5 18:23
赵庆礼 发表于 2012-7-5 18:21
这里的new String是将数组c变成字符串,为什么这么new,是String的构造函数?
new String(c, 0, len)是构造 ...
1024老毕说什么占多少字节阿,希望详细点啊,谢谢啦
作者:
周刚
时间:
2012-7-5 20:54
一个个回答楼主的问题。
1:1024代表1k=2^10,因为是字符流,所以1024个字符也就是2k个字节。至于说为什么要设置1024?这是做IT的人一种职业习惯,
也是计算机喜欢的数字,呵呵。因为计算机中的硬盘盘块也是1024k的整数倍。你完全可以不设置成1024,设置成1023也可以啊,但
那样做就显得外行了。呵呵
2:你的第一个程序整个都会出问题!因为你取的类名正好叫FileReader将系统自带的FileReader给覆盖了,所以new 的时候会调用你自建的FileReaer类
会报错说没有带String类型参数的new FileReaer构造方法。帮你将类名改了一下:
import java.io.*;
class FileReader2 {
public static void main(String[] args) {
FileReader fr = null;
try {
FileReader fr1 = new FileReader("a.txt");
fr = new FileReader("nihao.txt");
char[] c = new char[1024];// 1024又是怎么定义的?求详细,
// 上次了问了不是很清楚,希望详细点。谢谢
int num = 0;
while ((num = fr.read(c)) != -1) {
System.out.println(new String(c, 0, num));
}
}
catch (IOException e) {
System.out.println("catch:" + e.toString());// throw new
// IOException("出错了");我这里这样抛为什么不对啊,该怎么抛。
}
finally {
try {
if (fr != null)
fr.close();
}
catch (IOException e) {
System.out.println("catch:" + e.toString());// 这里的new
// String是将数组c变成字符串,
// 为什么这么new,是String的构造函数?
}
}
}
}
输出结果如下:
catch:java.io.FileNotFoundException: a.txt (系统找不到指定的文件。)
异常输出也很合理,因为我盘上确实没有这个文件
3:
bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.txt"));
上面这两句也是先指明了起始地和目的地啊,只是将代码浓缩了一下。可以分解如下:
FileReader fr = new FileReader("BufferedWriterDemo.java");
BufferedReader bufr = new BufferedReader(fr);
FileWriter fw = new FileWriter("bufWriter_Copy.txt");
BufferedWriter bufw = new FileWriter(fw);
显然,是设置了复制的源地址和目的地的!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2