FileOutputStream写入中文字符后,然后用FileInputStream一个个读取,出现的乱码问题。

问题

在我们用FileOutputStream写入中文和英文,然后用FileInputStream一个个读出来时,发现中文字符会出现乱码,而英文字符保持不变。

看如下代码:

package FileStream;

import java.io.*;
import java.util.Scanner;

public class Dome {
    public static void main(String[] args) throws IOException {
        Scanner input=new Scanner(System.in);
        File file=new File("stream.txt");
        System.out.println("请输入要写的内容:");
        String str=input.nextLine();
        FileOutputStream fos=new FileOutputStream(file);
        fos.write(str.getBytes());
        System.out.println("写入完毕!");
        fos.close();

        FileInputStream fis=new FileInputStream(file);
        int temp=0;//    解决方案:byte bytes[]=new byte[1024];   充当缓存区
        while((temp=fis.read())!=-1){//一个字节一个字节的读取文件    解决方案:(temp=fis.read(bytes))!=-1
            System.out.print((char) temp);   //将字节转成char输出   解决方案:new String(bytes,0,temp)   输出结果 从 0-temp 
        }
        fis.close();
    }
}

输出结果:


原因

因为FileInputStream是基于字节的文件输入流,而且我用的是没有参数的read()方法,也就是一个字节一个字节的从硬盘里读取数据,并且输出。英文占一个字节,读出可直接转成char类型输出。汉字一般占两个字节,而你只读一个字节就输出了。所以读到汉字时会乱码。

解决方案

根据以上原因,我们可以自己定义一个byte数组(缓冲区),每次读的字节数由我们控制。比如说:byte bytes[]=new byte[1024]; 然后读的时候read(bytes); 这样每次最多可以读1kb的数据放入bytes数组(缓冲区)中,然后将bytes中的数据输出即可。这样效率会比较高,对硬盘的损害也比较低(当你一个一个读时对硬盘的操作次数会比较多,而对于缓冲区,我们每一次可以读一大截数据,直接放入),延长硬盘的使用寿命。另一种方法就是用到IO流中的缓冲流BufferedInputStream,后面会写,敬请期待!


   每日鸡汤:After all,tomorrow is another day!


Over!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,将 PDF 转为 Word 有很多种方法,这里介绍使用 Apache POI 和 iText 来实现。POI 提供了对 Word 文档的操作,而 iText 可以解析 PDF 文件,并提供了一些字体处理的功能。下面是一个简单的示例代码,可以将 PDF 转为 Word 并解决中文乱码问题: ``` import java.awt.Color; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.PdfTextExtractor; import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy; public class PdfToWordConverter { public static void main(String[] args) throws Exception { // 1. 读取 PDF 文件 PdfReader reader = new PdfReader(new FileInputStream(new File("input.pdf"))); // 2. 获取 PDF 文件中的文本 StringBuilder sb = new StringBuilder(); for (int i = 1; i <= reader.getNumberOfPages(); i++) { String text = PdfTextExtractor.getTextFromPage(reader, i, new SimpleTextExtractionStrategy()); sb.append(text); } reader.close(); // 3. 将文本写入 Word 文件 XWPFDocument document = new XWPFDocument(); XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(sb.toString()); run.setColor(Color.BLACK); // 4. 保存 Word 文件 FileOutputStream out = new FileOutputStream(new File("output.docx")); document.write(out); out.close(); document.close(); } } ``` 在上面的示例代码中,我们首先使用 iText 读取 PDF 文件,并获取 PDF 文件中的文本。然后使用 POI 创建一个新的 Word 文档,将文本写入 Word 文件中,并设置文本颜色。最后将 Word 文件保存到本地磁盘上。 需要注意的是,上面的代码只能处理纯文本的 PDF 文件,并且对于一些特殊的字体或字符,可能仍然会出现乱码问题。如果需要处理 PDF 中的图片或表格,可以使用其他的 PDF 转 Word 工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值