java 用FileInputStream中read方法读取文件出现乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 用FileInputStream中read方法读取文件出现乱码相关的知识,希望对你有一定的参考价值。

用中间变量temp=is.read()后就会正常输出,反之就出现乱码

package com.wepul.Exercise;

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

public class Night_Test_Stream
public static void main(String[] args)
File f =new File("D://abc.txt");
byte b[] = new byte[(int) f.length()];
try
int i =0;
// int temp=0;
InputStream is = new FileInputStream(f);
while(is.read()!=-1)
b[i]=(byte) is.read();

i++;

catch (FileNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();

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


while(is.read()!=-1)
    b[i]=(byte) is.read();
    i++;

这里是错的,当判断is.read() != -1的时候这个字节就已经被读取了,于是b[i] = (byte) is.read();这里读取的就是后面一个字节,自然会乱码。解决方法如下:

byte c = (byte)is.read();
while(c != -1)
    b[i] = c
    i++;
    c = (byte)is.read();

还有一种更方便的:

byte[] b = new byte[is.available()];
is.read(b);

参考技术A read方法读取的是字节流(每次读取一个字节),如果是中文,就是两个字节,就会出现乱码的。
可以通过BufferedReader 流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader bre = null;
try
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环

System.out.println(str);//原样输出读到的内容

备注: 流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
参考技术B 额,仔细看了下,你用int来接本来就不对。byte和int是不同的

byte是1字节,int是4字节。。。。

java 小程序误区。。FileInputStream in = null; try in = new FileInputStream(。。。。。为啥这么定

import java.io.*;
public class TextInputStream
public static void main(String[] arge)
int n = 0;long num = 0;
try
FileInputStream f = new FileInputStream("C:\\Users\\T-jie\\Desktop\\tst\\java\\TextInputStream.java");
catch(FileNotFoundException e)
System.out.println("没找到文件");
System.exit(0);

try
while((n=f.read())!=-1)
System.out.print((char)n);
num++;

f.close();
catch(IOException i)System.exit(0);
System.out.print(num);



FileInputStream f = null;
try
f = new FileInputStream("C:\\Users\\T-jie\\Desktop\\tst\\java\\TestFileInputStream.java");。。。为什么要这么定义 f 不能按我上面那么定义

你好,这就是变量作用域的意思。
你的定义,变量f只能在你第一个try中是可见的,其余地方引用就会报错,而正确的写法就将变量f定义在了try外面,导致f的作用域变为f所在的那层{},在两个try中都是可见的。
参考技术A 变量只在其最近的前一个 和后一个 区域中有作用,并在此段代码执行完的时候销毁。 参考技术B 怎么你的意思都不是很清楚

以上是关于java 用FileInputStream中read方法读取文件出现乱码的主要内容,如果未能解决你的问题,请参考以下文章

java服务器端用传输给客户端文件流(fileinputstream),客户端应该如何接收?(socket )

java中FileInputStream中如何保证是连着读取文件的?

Java中从文件中读取数据用啥函数

java 小程序误区。。FileInputStream in = null; try in = new FileInputStream(。。。。。为啥这么定

java的byte数组最多存储多少字节?只用FileInputStream读取文件和只用FileOutputStream写入文件会出问题吗

java中,如何将InputStream类型的东东转成FileInputStream类型?