java IO字节流

Yan_0629 2010-03-04 06:07:50
怎么用字节流读一篇TXT文件(带中文的),规定:用2个大小的byte数组读
如:txt文件内容如下:
1啊bnsns你好!

每次read的时候是把byte数组读满,那么第一次read的时候 读了1和啊的一半``这样转字符串输出就出现了乱码,怎么解决这问题?
...全文
877 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
a343532264 2010-08-25
  • 打赏
  • 举报
回复
两者的区别是?
大蚂虾 2010-08-10
  • 打赏
  • 举报
回复
楼主吃饱了撑的啊,难道是学校老师留的作业??

读文本用字符流,读数据用字节流

读文本用字节流,还限制缓冲区大小,你就直接告诉老师,此脑残问题本人不予以回答。。。
智鹿软件 2010-03-09
  • 打赏
  • 举报
回复
字节流:
package IO;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* test.getBytes("iso8859-1"))
* 用OutputStream和InputStream实现文件的写入和读取(字节的写入和读取)
*
*/
public class InAndOut {
String path="e:\\abc.txt";
public static void main(String[] args) {
InAndOut io=new InAndOut ();
io.write("我是邪恶少年!");
io.read();
}
public void write(String content)
{
File f=new File (path);
boolean add=true;//是否写入
try {
if (f.exists()==false) {
f.createNewFile();
FileOutputStream os=new FileOutputStream (f);//不用判断是否写入
//FileOutputStream os=new FileOutputStream (f,add);//要判断是否写入
os.write(content.getBytes());
os.flush();
os.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void read()
{
try {
InputStream is=new FileInputStream(path);
//BufferedInputStream bis=new BufferedInputStream(new FileInputStream(path));
int temp=0;
String test="";
try {
while ((temp=is.read())!=-1) {
test+=(char)temp;
}
System.out.println(new String (test.getBytes("iso8859-1")));//会出现乱码
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

字符流:
package IO;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
/**
*
*用read和write实现文件的写入和读取(字符的写入和读取)
*
*/
public class ReadAndWrite {
//定义文件的路径,一边写入和读取使用
String path="e:\\abc.txt";

public static void main(String[] args) {
ReadAndWrite r=new ReadAndWrite ();
r.writeFile("我乃邪恶少年是也!");
r.readFile();
}
private void readFile() {
// TODO Auto-generated method stub
try {
Reader r=new BufferedReader (new FileReader(path));
String test="";
int temp=0;
try {
while ((temp=r.read())!=-1) {
test+=(char)temp;
}
System.out.println(test);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void writeFile(String content) {
// TODO Auto-generated method stub
File f=new File (path);
if (f.exists()==false) {
try {
f.createNewFile();
FileWriter fw=new FileWriter (f);
fw.write(content);
fw.flush();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}else {
System.out.println(path+"已存在,写入失败,源文件是");
}
}
}
liboofsc 2010-03-05
  • 打赏
  • 举报
回复
不懂,为啥不用节符流呢?
neunaruto 2010-03-05
  • 打赏
  • 举报
回复
lz非要使用字节流的话来实现上述功能的话也可以实现,但是需要保证:
file.encoding=Unicode,读取文本文件以Unicode的形式读取,显示读取内容的时候,以Unicode编码的方式显示,才能显示正确的文本信息。如果你使用中文操作系统,默认的编码方式是GBK(file.encoding=GBK),它以GBk的编码方式(变长编码)来编译中文,你在显示的时候却以定长的编码方式来显示它,肯定是会出现乱码的。你如果在英文版的操作系统进行上述操作应该就不会又问题了。
写了一段代码对你了解编码会有帮助,仅供参考:
byte[] a = "1啊bnsns你好".getBytes("Unicode");
byte[] b = new byte[4];
b[0]=-1;
b[1]=-2;
System.out.println("a.length="+a.length);
for(int i=2;i<a.length;i+=2){
b[2]=a[i];
b[3]=a[i+1];
System.out.println(new String(b,"Unicode"));
}
"1啊bnsns你好".getBytes("Unicode")生成的字节数组中前两个字节是标志位,bytes[0] = -2,bytes[1] = -1。因此在编码和解码的过程中都要加上。
冰思雨 2010-03-04
  • 打赏
  • 举报
回复
楼主想法很闪亮。
读取的是文本信息,偏要按二进制字节来处理。
可能是编程经验比较少吧。
我们的字符是要编码的,所以,一个字符到底会占多少个字节,要由编码决定。
通常,带有汉字和英文字符的文本,我们都用GBK编码来处理。
如果存在日文和韩文(比如歌曲名称啊什么的),会用UTF-8编码来处理。
楼主的问题,其实很好解决,那就是放弃使用InputStream改用Reader来读取文本。
很显然,InputStream和OutputStream是面向二进制字节流的。
而Reader和Writer则是面向字符(或字符串)的。当然,原则上也支持字节流的处理。
文本文件的读取,不妨使用FileReader类,高效的话,再套个BufferedReader就OK了。
他里面对字节流的Decode过程。

另外,GBK和GB2312编码,是变长编码,并不是所有的字符都占2个字节。
星辰企业 2010-03-04
  • 打赏
  • 举报
回复
上面的是代码下面的是运行结果
星辰企业 2010-03-04
  • 打赏
  • 举报
回复
package com.wsb.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ReadyFile {

/**
* @param args
*/
public static void main(String[] args) {

//定义一个固定大小的字节数组长度为2
byte[] by = new byte[2];

try {
//创建一个文件对象用于去读取文件对象
File file = new File("D:/3.txt");

//定义一个字节读取流对文件进行读取
FileInputStream fis = new FileInputStream(file);

byte[] b = new byte[(int)file.length()]; //定义一个与文件字节长度一样大小的字节数组

int i = 0 ; //记录字节数据保存到了哪一个下标

while((fis.read(by)) > 0){
for(int j = 0 ; j < by.length; j ++,i++){
try{
b[i] = by[j]; //将读取到的字节保存到字节数组当中
//由于当前定义每次去读取的字节数组的大小固定,所以有可能超出下标
}catch(ArrayIndexOutOfBoundsException e){

}
}
}
System.out.println(new String(b));

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}

}

}
1啊bnsns你好! 
wenzheng38 2010-03-04
  • 打赏
  • 举报
回复
先用字节流读出时,然后再把所有字节转换成字符不就行了
YangMacgrady 2010-03-04
  • 打赏
  • 举报
回复
楼主强调只用2字节的字节流吧~~
holsten32 2010-03-04
  • 打赏
  • 举报
回复
我顶我顶我顶顶顶顶顶顶
lgf11088 2010-03-04
  • 打赏
  • 举报
回复
楼上的方法可行.........
wzju64676266 2010-03-04
  • 打赏
  • 举报
回复
BufferedReader b=new BufferedReader(new FileReader("文件"));
b.readLine();//每次返回一行

刚才写错了行
wzju64676266 2010-03-04
  • 打赏
  • 举报
回复
如果你用字符流读写的话就不会出现 这种问题Write Reader,因为操使用的是两个字节,如果用字节流的话就会出现这种问题InputStream OutStream,因为操作使用一个字节
BufferedReader b=new BufferedReader(FileReader("文件"));
b.readLine();//每次返回一行
Yan_0629 2010-03-04
  • 打赏
  • 举报
回复
就算不2个大小byte数组,只要不是一次读完就有可能出现只读了半个中文字的可能啊!
也有可能出先乱码!
py330316117 2010-03-04
  • 打赏
  • 举报
回复
先把txt中的文件放在stringbuffer中,再把strngbuffer转换成byte
小贝壳666 2010-03-04
  • 打赏
  • 举报
回复
将所有结果连在一起打印输出
canoe982 2010-03-04
  • 打赏
  • 举报
回复
如果不用unicode编码的话,不懂为什么要用2个大小的byte数组读。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧