第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-文件的天下大势的主要内容,如果未能解决你的问题,请参考以下文章