HDFS读取excel内容出现乱码

发布于 2022-09-03 12:34:16 字数 3910 浏览 15 评论 0

1.使用poi生成excel,上传hdfs
2.当有需要的时候,去下载该文件
3.下载文件是通过rest接口
4.接口中通过hdfs api读取hdfs上的excel文件内容,并转成字符串,响应到客户端

图片描述
图1 通过hdfs的get命令拉去的文件,显示正常

图片描述
图2 通过hdfs的java api下载的文件内容,显示乱码
最原始的代码:

public static String readFile(Configuration conf, String filePath) throws IOException,
            URISyntaxException {
        String fileContent = null;
        FileSystem fs = getFileSystem(conf);
        Path path = new Path(filePath);
        InputStream inputStream = null;
        ByteArrayOutputStream outputStream = null;
        try {
            inputStream = fs.open(path);
            outputStream = new ByteArrayOutputStream(inputStream.available());
            IOUtils.copyBytes(inputStream, outputStream, conf);
            byte[] lens = outputStream.toByteArray(); //解决中文乱码
            fileContent = new String(lens, "UTF-8");
        } finally {
            IOUtils.closeStream(inputStream);
            IOUtils.closeStream(outputStream);
            fs.close();
        }
        return fileContent;
    }

修改后的代码:

/**
     * 读取文件内容
     *
     * @param conf
     * @param filePath
     * @return
     * @throws IOException
     */
    public static String readFile(Configuration conf, String filePath) throws IOException,
            URISyntaxException {
        String fileContent = null;
        FileSystem fs = getFileSystem(conf);
        Path path = new Path(filePath);
        FSDataInputStream in = null;
        ByteArrayOutputStream outputStream = null;
        try {
            in = fs.open(path);
            outputStream = new ByteArrayOutputStream();
            //IOUtils.copyBytes(in, outputStream, conf);   //这个也是乱码

            byte[] b = new byte[1024];
            int numBytes = 0;
            while ((numBytes = in.read(b)) > 0) {
                outputStream.write(b, 0, numBytes);
            }
            fileContent = new String(outputStream.toByteArray(), "UTF8");
        } finally {
            IOUtils.closeStream(in);
            IOUtils.closeStream(outputStream);
            fs.close();
        }
        return fileContent;

网上的方法基本都用过了,ByteArrayOutputStream换成FsDataOutputStream也尝试过了,也是乱码。

public static String readFile(Configuration conf, String filePath) throws IOException,
            URISyntaxException {
        String fileContent = null;
        FileSystem fs = getFileSystem(conf);
        Path path = new Path(filePath);
        FSDataInputStream fin = null;
        InputStreamReader bin = null;
        int line;
        try {
            StringBuffer buffer = new StringBuffer();
            fin = fs.open(path);
            bin = new InputStreamReader(fin, "UTF-8");

            while ((line = bin.read()) > 0) {
                buffer.append(line);
            }
            fileContent = new String(buffer);
        } finally {
            IOUtils.closeStream(fin);
            IOUtils.closeStream(bin);
            fs.close();
        }
        return fileContent;
    }

使用System.out也是乱码:

public static String readFile(Configuration conf, String filePath) throws IOException,
            URISyntaxException {
        String fileContent = null;
        FileSystem fs = getFileSystem(conf);
        Path path = new Path(filePath);
        FSDataInputStream in = null;
        int line;
        try {
            in = fs.open(path);
            IOUtils.copyBytes(in, System.out, 4096, false);
            fileContent = new String("");
        } finally {
            IOUtils.closeStream(in);
            fs.close();
        }
        return fileContent;
    }

我对IO流不熟悉,求大神们帮忙看看!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

山人契 2022-09-10 12:34:16

已解决!
解决方案我已整理:

基于haddop的HDFS和Excel开源库POI导出大数据报表·踩过的坑

欢迎大家给出自己的意见和建议,也欢迎大家一起研究!

飞烟轻若梦 2022-09-10 12:34:16

fileContent = new String(outputStream.toByteArray(), "UTF8");
你这转码是干什么用的?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文