第55题输入输出系列3-文件的天下大势

Posted 小虚竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第55题输入输出系列3-文件的天下大势相关的知识,希望对你有一定的参考价值。

回城传送–》《JAVA筑基100例》

文章目录

零、前言

​ 今天是学习 JAVA语言 打卡的第55天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。

​ 因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述-合并多个文本文件

1、题目

题目:做一个合并多个文本文件的工具。

2、解题思路

创建一个类:TextFileConcatenation

使用TextFileConcatenation继承JFrame构建窗体

读取文本文件时,用的是BufferedReader类的readLine()方法读入一行数据。

将选择的多个文本文件合并到d://concatenation.txt

3、代码详解

package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/**
 * Description: 合并多个文本文件工具
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create
 * </pre>
 * @date 2022/5/3
 */

public class TextFileConcatenation extends JFrame 

    /**
     *
     */
    private JPanel contentPane;
    private JTextField textField;
    private File[] textFiles;
    private JTextArea textArea;

    /**
     * Launch the application.
     */
    public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 
            public void run() 
                try 
                    TextFileConcatenation frame = new TextFileConcatenation();
                    frame.setVisible(true);
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        );
    

    /**
     * Create the frame.
     */
    public TextFileConcatenation() 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.NORTH);

        JLabel fileLabel = new JLabel("文件夹所在位置");
        panel.add(fileLabel);

        textField = new JTextField();
        panel.add(textField);
        textField.setColumns(10);

        JButton button = new JButton("选择文件夹");
        button.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent e) 
                do_button_actionPerformed(e);
            
        );
        panel.add(button);

        JScrollPane scrollPane = new JScrollPane();
        contentPane.add(scrollPane, BorderLayout.CENTER);

        textArea = new JTextArea();
        scrollPane.setViewportView(textArea);

        JPanel buttonPanel = new JPanel();
        contentPane.add(buttonPanel, BorderLayout.SOUTH);

        JButton concatButton = new JButton("合并文件");
        concatButton.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent e) 
                do_concatButton_actionPerformed(e);
            
        );
        buttonPanel.add(concatButton);
    

    protected void do_button_actionPerformed(ActionEvent e) 
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setMultiSelectionEnabled(false);
        int result = chooser.showOpenDialog(this);
        if (result == JFileChooser.APPROVE_OPTION) 
            File selectFile = chooser.getSelectedFile();
            textField.setText(selectFile.getAbsolutePath());
            textFiles = selectFile.listFiles(new FileFilter() 

                @Override
                public boolean accept(File pathname) 
                    if (pathname.getAbsolutePath().endsWith(".txt")) 
                        return true;
                     else 
                        return false;
                    
                
            );
            for (File textFile : textFiles) 
                textArea.append(textFile.getAbsolutePath() + "\\n\\r");
            
        
    

    protected void do_concatButton_actionPerformed(ActionEvent e) 
        if (textFiles == null) 
            JOptionPane.showMessageDialog(this, "请选择文件文件位置!", "警告信息", JOptionPane.WARNING_MESSAGE);
            return;
        
        if (textFiles.length == 0) 
            JOptionPane.showMessageDialog(this, "文件夹中不包括文本文件!", "警告信息", JOptionPane.WARNING_MESSAGE);
            return;
        
        BufferedReader reader = null;
        FileWriter writer = null;
        try 
            writer = new FileWriter("d://concatenation.txt");// 创建文件输出流
            for (File textFile : textFiles) // 遍历用户选择的文本文件
                reader = new BufferedReader(new FileReader(textFile));// 创建缓冲输入流
                String line;
                while ((line = reader.readLine()) != null) 
                    writer.write(line);// 将读入的数据写入到文件中
                
            
            JOptionPane.showMessageDialog(this, "文件合并成功!", "提示信息", JOptionPane.INFORMATION_MESSAGE);
            return;
         catch (IOException e1) 
            e1.printStackTrace();
         finally 
            if (writer != null) 
                try 
                    writer.close();
                 catch (IOException e1) 
                    e1.printStackTrace();
                
            
            if (reader != null) 
                try 
                    reader.close();
                 catch (IOException e1) 
                    e1.printStackTrace();
                
            
        
    


启动:

合并前:选择文件夹

合并后:

二、题目描述-对大文件进行分割处理

1、题目

题目:大数据文件为了方便传输,通常会进行切割处理。

实现一个将大文件分割成多个文件的工具

2、解题思路

创建一个类:ComminuteFrame

使用ComminuteFrame继承JFrame构建窗体

ComminuteFrame 增加标签,文本框和分割按钮

创建一个类:ComminuteUtil

ComminuteUtil主要处理分割的逻辑处理

通过输入流读取要分割的文件,分别从流中读取相应的字节数;

将其写到.tem的后缀文件中,分割的文件存放在源文件的对应目录下。

3、代码详解

ComminuteFrame类

package com.xiaoxuzhu;

import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/**
 * Description: 对大文件进行分割处理
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create
 * </pre>
 * @date 2022/5/3
 */

public class ComminuteFrame extends JFrame 

    /**
     *
     */
    private static final long serialVersionUID = 2547743180459668116L;
    private JPanel contentPane;
    private JTextField sourceTextField;
    private JTextField sizeTextField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    ComminuteFrame frame = new ComminuteFrame();
                    frame.setVisible(true);
                 catch (Exception e) 
                    e.printStackTrace();
                
            
        );
    

    /**
     * Create the frame.
     */
    public ComminuteFrame() 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 430, 211);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        setTitle("文件分割");
        JPanel panel = new JPanel();
        panel.setBounds(0, 0, 414, 181);
        contentPane.add(panel);
        panel.setLayout(null);

        JLabel messagelabel = new JLabel("源文件:");
        messagelabel.setBounds(47, 41, 54, 20);
        panel.add(messagelabel);

        sourceTextField = new JTextField();
        sourceTextField.setBounds(105, 41, 178, 21);
        panel.add(sourceTextField);
        sourceTextField.setColumns(10);

        JButton sourceButton = new JButton("选择");
        sourceButton.addActionListener(new ActionListener() 
            @Override
            public void actionPerformed(ActionEvent arg0) 
                do_sourceButton_actionPerformed(arg0);
            
        );
        sourceButton.setBounds(303, 40, 67, 23);
        panel.add(sourceButton);

        JLabel sizelabel = new JLabel("分割大小:");
        sizelabel.setBounds(34, 86, 67, 15);
        panel.add(sizelabel);

        sizeTextField = new JTextField();
        sizeTextField.setBounds(105, 83, 178, 21);
        panel.add(sizeTextField);
        sizeTextField.setColumns(10);
        sizeTextField.addKeyListener(new KeyAdapter() 
            @Override
            public void keyTyped(KeyEvent event)  // 某键按下时调用的方法
                char ch = event.getKeyChar(); // 获取用户键入的字符
                if ((ch < '0' || ch > '9'))  // 如果用户输入的信息不为数字或小数
                    event.consume(); // 不允许用户键入
                

            
        );

        JLabel lblM = new JLabel("M");
        lblM.setBounds(313, 86, 44, 15);
        panel.add(lblM);

        JButton cominButton = new JButton("分割");
        cominButton.addActionListener(new ActionListener() 
            @Override
            public void actionPerformed(ActionEvent arg0) 
                do_cominButton_actionPerformed(arg0);
            
        );
        cominButton.setBounds(101, 138, 93, 23);
        panel.add(cominButton);

        JButton close = new JButton("退出");
        close.addActionListener(new ActionListener() 
            @Override
            public void actionPerformed(ActionEvent arg0) 
                do_close_actionPerformed(arg0);
            
        );
        close.setBounds(229, 138, 93, 

以上是关于第55题输入输出系列3-文件的天下大势的主要内容,如果未能解决你的问题,请参考以下文章

第53题输入输出系列1-查找文件和替换文件内容

第57题输入输出系列5-文件锁定功能

第57题输入输出系列5-文件锁定功能

第59题输入输出系列7-压缩文件相关技术2

LeetCode 第55题 跳跃游戏

第56题输入输出系列4-读取Jar文件属性