草庐IT

java_io 涉及到文件(txt,图片)上传,下载,读取文件,excel上传和下载

Raral 2023-03-28 原文

java_io 涉及到文件(txt,图片)上传,下载,读取文件,excel上传和下载

字符流和字节流

  1. UML

字符流

byte.png

字节流

[图片上传失败...(image-d5611-1662632030088)]

  1. 字符流code

字符流输入



/**
 * 属于字节流 InputStream 输入流FileInputStream
 * FileInputStream:只能以字节单位读取,对汉字不友好;读取汉字乱码,换成字符流读取即可
 * 从另一角度来说:字符流 = 字节流 + 编码表。
 */
public class FileInputStreamTest {

    //FileInputStream读取 txt,中文乱码
//    public static void main(String[] args) throws IOException {
//        //创建一个输入流,方便读取
//        FileInputStream fis = new FileInputStream("D:/output4.txt");
//
//        //定义一个字节数组,装字节数据容器
//        byte[] b = new byte[2];
//        while (fis.read(b) != -1) {
//            //按照每2个字节读取: 一个英文单词一个字节,一个汉字3个字节
//            System.out.println(new String(b));
//
//        }
//    }

    //InputStreamReader: 根据字符读取,但是不能一行一行读取;解决:使用缓冲流解决
    public static void main(String[] args) throws IOException {
        //创建一个输入流,方便读取
        FileInputStream fis = new FileInputStream("D:/output4.txt");

        //转换成字符流的输入流
        Reader reader = new InputStreamReader(fis,"utf-8");
        char[] b = new char[2];

        int readData;
        while (-1 != (readData = reader.read(b))) {
            //按照每4个字节读取: 一个汉字一个字符
            System.out.println(new String(b));

        }

    }
}

字符流输出


/**
 * 字节流,OutputStream输出流:FileOutputStream,ObjectOutputStream
 * 写入不了汉字字符串
 */
public class FileOutputStreamTest {

    //FileOutputStream测试
//    public static void main(String[] args) throws Exception {
//        //定义一个文件输出流:相当于一个最终输出的容器,以文件形式存在
//        FileOutputStream fos = new FileOutputStream("D:/output.txt");
//        fos.write(97);//可以写int
//        fos.write("abc".getBytes());//写字节
//        fos.write("qwer".getBytes(),1,2);//写指定长度的字节
//        fos.close();//关闭资源
//
//    }

    //ObjectOutputStream 功能更强大,输出流可以写 汉字字符串,对象
    //解决乱码:对象没有序列化,但是写汉字字符串依然乱码
    //解决汉字乱码:使用PrintStream
    public static void main(String[] args) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/output2.txt"));
        String s = "abc";
        oos.writeChars(s);
        Map<String, String> map = new HashMap<>();
        map.put("name","lg");
        map.put("age", "10");
        oos.writeObject(JSONObject.toJSONString(map));
        oos.close();//关闭资源

        PrintStream printStream = new PrintStream(new FileOutputStream("D:/output3.txt"));
        printStream.println("发的发但是\n rqwer");
        printStream.close();
    }
}

字符流读


/**
 * 字符流,读,
 * InputStreamReader:按照字符读取,效率低
 * BufferedReader:按照一行读取,效率高;字节流 => 字符流读 => 缓冲流读
 */
public class InputStreamReadTest {

    //InputStreamReader
//    public static void main(String[] args) throws IOException {
//        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("D:/test.txt"));
//
//        char[] chars = new char[2];
//
//        while (inputStreamReader.read(chars) != -1) {
//            System.out.println(new String(chars));
//        }
//
//    }

    // 字节流 => 字符流读 => 缓冲流读
    public static void main(String[] args) throws IOException{
        Reader reader = new InputStreamReader(new FileInputStream("D:/test.txt"));
        BufferedReader bufferedReader = new BufferedReader(reader);
        String lineStr = null;
        while ((lineStr = bufferedReader.readLine()) != null) {
            System.out.println(lineStr);
        }

        bufferedReader.close();
    }
}

字符流写


/**
 * 字符流,写入,依赖于字节流
 * OutputStreamWriter:只能写入字符,字符串,
 * OutputStreamWriter:写入效率快
 */
public class OutputStreamWriterTest {
    //OutputStreamWriter
//    public static void main(String[] args) throws IOException,Exception {
//        //字符流写的创建依赖与 字节流输出创建
//        Writer writer = new OutputStreamWriter(new FileOutputStream("D:/output6.txt"), "utf-8");
//
//        writer.write("发放时");//
//
//        writer.close();
//
//    }

    //字节流 =》 字符流 => 缓存字符流  : 效率快
    public static void main(String[] args) throws IOException {
        Writer writer = new OutputStreamWriter(new FileOutputStream("D:/output6.txt"), "utf-8");
        BufferedWriter bufferedWriter = new BufferedWriter(writer);
        bufferedWriter.write("Fsdfasd方法士大夫");
        bufferedWriter.close();
    }
}

  1. 总结
  • 字符流 比 字节流 效率慢;字符流适合中文读写操作
  • 可以使用缓冲流 提升读写效率;字节流 =》 字符流 =》 缓存字符流
  • 注意:中文乱码bug
  • 序列化问题
  • 编码格式

上传和下载

excel上传和下载

使用第三方的jar

<!--        excel导入和导出工具 easypoi-base-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
  1. 后台代码
//实体必须加上注解@Excel
@Data
@AllArgsConstructor
public class UserDTO {

    @Excel(name = "名称")
    private String name;
    @Excel(name = "年龄")
    private Integer age;
}

@RequestMapping("/user")
@RestController
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/find")
    public String find() {
        String s = userService.find();
        return s;
    }


    //上传功能
    @PostMapping("/importExecl")
    public String importExecl(@RequestParam("file") MultipartFile file) throws Exception {
//        Excel
        List<UserDTO> userDTOS = ExcelImportUtil.importExcel(file.getInputStream(), UserDTO.class, new ImportParams());
        userDTOS.stream().forEach(v -> System.out.println(v));
        //插入数据库操作
        return "ok";
    }

    //导出功能
    @GetMapping("/exportExecl")
    public String exportExecl(String id, HttpServletRequest request, HttpServletResponse response) throws IOException {
        List<UserDTO> userDTOS = new ArrayList<>();
        userDTOS.add(new UserDTO("FASD",12));
        userDTOS.add(new UserDTO("Fdsf",100));

        //必须设置的
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=" + "用户");
        Workbook sheets = null;
        ExportParams exportParams = new ExportParams(null,"用户");
        exportParams.setType(ExcelType.XSSF);
        ServletOutputStream outputStream = response.getOutputStream();

        try {
            sheets = ExcelExportUtil.exportBigExcel(exportParams, UserDTO.class, userDTOS);

            sheets.write(outputStream);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (sheets != null){
                sheets.close();
            }
            ExcelExportUtil.closeExportBigExcel();
        }


        return "ok";
    }



}


  1. 前端 代码 jq ajax
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <!-- <script src="./js-file-download-master/file-download.js"></script> -->
</head>

<body>
    <input type="file" id="file">
    <button id="import">上传</button>
    <button id="export">导出</button>


</body>
<script>

    //导出
    $("#export").click(() => {
        $.ajax({
            url: "http://127.0.0.1:8080/user/exportExecl",
            method: "GET",
            data: null,
            processData: false,
            contentType: false,
            xhrFields: { responseType: "arraybuffer" },//必须设置,不然会乱码
            success: function (res) {
                console.log(res);

                //
                const blob = new Blob([res], { type: "application/vnd.ms-excel" });

                if (blob.size < 1) {

                    alert('导出失败,导出的内容为空!');

                    return

                }

                if (window.navigator.msSaveOrOpenBlob) {

                    navigator.msSaveOrOpenBlob(blob, '用户.xlsx')

                } else {

                    const aLink = document.createElement('a');

                    aLink.style.display = 'none';
                    //[关键]
                    aLink.href = window.URL.createObjectURL(blob);//把二进制流转换成下载链接

                    aLink.download = '用户.xlsx';

                    document.body.appendChild(aLink);

                    aLink.click();

                    document.body.removeChild(aLink);

                }

            }

        })


    })

    //下载
    $("#import").click(() => {
        let file = $("#file")[0].files[0];
        console.log(file)
        let formData = new FormData();
        formData.append("file", file);


        $.ajax({
            url: "http://127.0.0.1:8080/user/importExecl",
            method: "POST",
            data: formData,
            processData: false,
            contentType: false,
            success: function (res) {
                console.log(res);
                fileDownload(res, '用户.xlsx');
            }

        })

    })

    $.ajax({
        url: "http://127.0.0.1:8080/user/find",
        method: "GET",
        success: function (res) {
            console.log(res);
        }

    })
</script>

</html>

有关java_io 涉及到文件(txt,图片)上传,下载,读取文件,excel上传和下载的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐