最近發(fā)現(xiàn)磁盤空間嚴(yán)重不足,都彈窗提示我了:
想想看到底哪個(gè)文件夾占的空間比較大,好做針對(duì)性的刪除和清理。奈何Windows系統(tǒng)沒有查看文件夾大小的工具,只能鼠標(biāo)放在某個(gè)文件夾上,等提示:
AI時(shí)代都來臨了,就讓大語言模型
幫我寫一個(gè)程序吧:計(jì)算指定文件夾中所有文件夾的大小并排序。
初版
于是,我就向大語言模型
提問:
你是一個(gè)卓越的Java程序員,計(jì)算指定文件夾中所有文件夾的大小并排序。
完整的代碼是這樣的:
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class FolderSizeCalculator {
public static void main(String[] args) {
// 指定文件夾路徑
String folderPath = "/path/to/folder";
// 獲取文件夾列表
File folder = new File(folderPath);
File[] folderList = folder.listFiles(File::isDirectory);
// 計(jì)算每個(gè)文件夾的大小并存儲(chǔ)到ArrayList中
ArrayList<Folder> folders = new ArrayList<>();
for (File f : folderList) {
long size = getFolderSize(f);
Folder folderObj = new Folder(f.getName(), size);
folders.add(folderObj);
}
// 根據(jù)文件夾大小進(jìn)行排序
Collections.sort(folders, Comparator.comparingLong(Folder::getSize));
// 輸出結(jié)果
for (Folder f : folders) {
System.out.println(f.getName() + " - " + formatSize(f.getSize()));
}
}
// 遞歸計(jì)算文件夾大小
public static long getFolderSize(File folder) {
long size = 0;
File[] fileList = folder.listFiles();
if (fileList != null) {
for (File f : fileList) {
if (f.isFile()) {
size += f.length();
} else {
size += getFolderSize(f);
}
}
}
return size;
}
// 格式化文件大小
public static String formatSize(long size) {
String[] units = {"B", "KB", "MB", "GB", "TB"};
int i = 0;
double s = size;
while (s >= 1024 && i < units.length - 1) {
s /= 1024;
i++;
}
return String.format("%.2f %s", s, units[i]);
}
}
// 文件夾類
class Folder {
private String name;
private long size;
public Folder(String name, long size) {
this.name = name;
this.size = size;
}
public String getName() {
return name;
}
public long getSize() {
return size;
}
}
使用File
類獲取指定文件夾中的所有子文件夾,然后使用遞歸函數(shù)getFolderSize
計(jì)算每個(gè)文件夾的大小,最后將結(jié)果存儲(chǔ)到一個(gè)ArrayList
中。程序使用Collections.sort
方法根據(jù)文件夾大小對(duì)ArrayList
進(jìn)行排序,并使用formatSize
方法格式化文件大小并輸出結(jié)果。
修改一下指定文件夾的路徑就可以運(yùn)行,效果還不錯(cuò):
社 - 646.13 KB
學(xué) - 141.15 MB
貓 - 587.99 MB
萬 - 1.52 GB
唯一有一點(diǎn)小瑕疵,排序是從小到大的,稍微做一下修改,把
// 根據(jù)文件夾大小進(jìn)行排序
Collections.sort(folders, Comparator.comparingLong(Folder::getSize));
修改為:
// 根據(jù)文件夾大小進(jìn)行排序
Collections.sort(folders, (f1, f2) -> Long.compare(f2.getSize(), f1.getSize()));
運(yùn)行一下,看看效果:
萬 - 1.52 GB
貓 - 587.99 MB
學(xué) - 141.15 MB
社 - 646.13 KB
進(jìn)化
每次修改需要計(jì)算的文件夾路徑時(shí),都需要修改代碼重新運(yùn)行,很不方便。我想到了Swing,可以用UI進(jìn)行交互。于是,我又向大語言模型
重新提問:
你是一個(gè)卓越的Java程序員,計(jì)算指定文件夾中所有文件夾的大小并排序,要求是使用Swing交互,包括輸入指定文件夾、展示文件夾大小。
完整的代碼如下:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class FolderSizeSorter extends JFrame {
private JLabel directoryLabel;
private JTextField directoryTextField;
private JButton calculateButton;
private JTextArea resultTextArea;
public FolderSizeSorter() {
super("Folder Size Sorter");
// set up UI components
directoryLabel = new JLabel("Directory:");
directoryTextField = new JTextField(20);
calculateButton = new JButton("Calculate");
resultTextArea = new JTextArea(20, 40);
JScrollPane scrollPane = new JScrollPane(resultTextArea);
// set up layout
JPanel inputPanel = new JPanel();
inputPanel.add(directoryLabel);
inputPanel.add(directoryTextField);
inputPanel.add(calculateButton);
add(inputPanel, BorderLayout.NORTH);
add(scrollPane, BorderLayout.CENTER);
// set up event listeners
calculateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
calculateFolderSizes();
}
});
// set up window properties
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 400);
setVisible(true);
}
private void calculateFolderSizes() {
String directoryPath = directoryTextField.getText();
File directory = new File(directoryPath);
if (!directory.isDirectory()) {
JOptionPane.showMessageDialog(this, "Please enter a valid directory path.");
return;
}
Map<File, Long> folderSizes = new HashMap<>();
calculateFolderSizesRecursive(directory, folderSizes);
List<Map.Entry<File, Long>> folderSizesList = new ArrayList<>(folderSizes.entrySet());
Collections.sort(folderSizesList, new Comparator<Map.Entry<File, Long>>() {
public int compare(Map.Entry<File, Long> o1, Map.Entry<File, Long> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
resultTextArea.setText("");
for (Map.Entry<File, Long> folderSize : folderSizesList) {
resultTextArea.append(folderSize.getKey().getPath() + " - " + formatSize(folderSize.getValue()) + "\n");
}
}
private void calculateFolderSizesRecursive(File folder, Map<File, Long> folderSizes) {
File[] files = folder.listFiles();
if (files == null) {
return;
}
long folderSize = 0;
for (File file : files) {
if (file.isDirectory()) {
calculateFolderSizesRecursive(file, folderSizes);
folderSize += folderSizes.get(file);
} else {
folderSize += file.length();
}
}
folderSizes.put(folder, folderSize);
}
private String formatSize(long size) {
String[] units = {"B", "KB", "MB", "GB", "TB"};
int unitIndex = 0;
double dSize = size;
while (dSize >= 1024 && unitIndex < units.length - 1) {
dSize /= 1024;
unitIndex++;
}
return String.format("%.2f %s", dSize, units[unitIndex]);
}
public static void main(String[] args) {
new FolderSizeSorter();
}
}
創(chuàng)建了一個(gè)GUI窗口,包括一個(gè)標(biāo)簽、一個(gè)文本框、一個(gè)按鈕,在文本框輸入文件夾的路徑,點(diǎn)擊“Calculate”就可以了,效果如下圖:
再進(jìn)化
在使用過程中,又有了新的問題:我看到某一個(gè)文件夾比較大,想再看看這個(gè)文件夾下的文件夾大小情況,還得手動(dòng)復(fù)制粘貼文件夾路徑重新計(jì)算,操作起來不是很方便。于是,我又向大語言模型
重新提問:
你是一個(gè)卓越的Java程序員,計(jì)算指定文件夾中所有文件夾的大小并排序,要求是使用Swing交互,包括:輸入指定文件夾、以樹型結(jié)構(gòu)展示文件夾的大小。
完整的代碼如下:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class FolderSizeCalculator extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JButton btnSelectFolder;
private JTree tree;
private DefaultTreeModel treeModel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FolderSizeCalculator frame = new FolderSizeCalculator();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FolderSizeCalculator() {
setTitle("Folder Size Calculator");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
btnSelectFolder = new JButton("Select Folder");
btnSelectFolder.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int result = fileChooser.showOpenDialog(FolderSizeCalculator.this);
if (result == JFileChooser.APPROVE_OPTION) {
File folder = fileChooser.getSelectedFile();
DefaultMutableTreeNode root = new DefaultMutableTreeNode(folder.getName());
treeModel = new DefaultTreeModel(root);
tree.setModel(treeModel);
calculateFolderSize(folder, root);
tree.expandRow(0);
}
}
});
contentPane.add(btnSelectFolder, BorderLayout.NORTH);
JScrollPane scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
tree = new JTree();
scrollPane.setViewportView(tree);
}
private void calculateFolderSize(File folder, DefaultMutableTreeNode node) {
long size = 0;
List<File> subfolders = new ArrayList<>();
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
subfolders.add(file);
} else {
size += file.length();
}
}
Collections.sort(subfolders);
for (File subfolder : subfolders) {
DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(subfolder.getName());
node.add(subnode);
calculateFolderSize(subfolder, subnode);
}
node.setUserObject(node.getUserObject() + " (" + humanReadableByteCount(size, false) + ")");
}
private String humanReadableByteCount(long bytes, boolean si) {
int unit = si ? 1000 : 1024;
if (bytes < unit)
return bytes + " B";
int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
}
}
這個(gè)程序中,創(chuàng)建了一個(gè)繼承自JFrame
的FolderSizeCalculator
類,并在其中創(chuàng)建了一個(gè)用戶界面。
我們可以通過點(diǎn)擊“Select Folder”按鈕來選擇要計(jì)算大小的文件夾。一旦用戶選擇了一個(gè)文件夾,程序?qū)?huì)計(jì)算該文件夾中所有文件夾的大小,并將結(jié)果以樹形結(jié)構(gòu)展示出來。
計(jì)算文件夾大小的方法是calculateFolderSize
,它使用遞歸來遍歷文件夾及其子文件夾,計(jì)算它們的大小。該方法將每個(gè)子文件夾作為一個(gè)節(jié)點(diǎn)添加到樹中,并將文件夾大小添加到節(jié)點(diǎn)名稱中。
humanReadableByteCount
是一個(gè)輔助方法,用于將文件大小從字節(jié)轉(zhuǎn)換為人類可讀的格式(如MB、GB等)。
運(yùn)行一下,看看效果:
發(fā)現(xiàn)了問題,子文件夾的大小反而比父文件夾的大,仔細(xì)閱讀了一下代碼發(fā)現(xiàn):在calculateFolderSize
方法中累加了文件的大小,沒有累加子文件夾的大小。于是,我又向大語言模型
重新提問:
你是一個(gè)卓越的Java程序員,把以下方法改下成計(jì)算文件下所有文件夾和文件的大小的總和
大語言模型
增加了一個(gè)calculateTotalSize
方法:
private long calculateTotalSize(File folder) {
long totalSize = 0;
if (folder.isDirectory()) {
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
totalSize += calculateTotalSize(file);
} else {
totalSize += file.length();
}
}
} else {
totalSize = folder.length();
}
return totalSize;
}
在該方法中,首先檢查傳遞的文件夾是否是文件夾類型。如果是文件夾,則迭代遍歷其所有子項(xiàng),如果子項(xiàng)是文件夾,則遞歸調(diào)用該方法以計(jì)算其大??;如果子項(xiàng)是文件,則將其大小加到總大小中。如果傳遞的文件夾是文件,則直接返回其大小。最終,該方法返回總大小。
將以上方法集成到原有方法中,用于計(jì)算文件夾下所有文件和文件夾的大小總和。以下是修改后的示例代碼:
private void calculateFolderSize(File folder, DefaultMutableTreeNode node) {
long size = calculateTotalSize(folder);
List<File> subfolders = new ArrayList<>();
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
subfolders.add(file);
}
}
Collections.sort(subfolders);
for (File subfolder : subfolders) {
DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(subfolder.getName());
node.add(subnode);
calculateFolderSize(subfolder, subnode);
}
node.setUserObject(node.getUserObject() + " (" + humanReadableByteCount(size, false) + ")");
}
我們可以發(fā)現(xiàn)大語言模型
修改后的代碼性能不是很好,因?yàn)?code>calculateFolderSize方法就是一個(gè)遞歸方法,在這個(gè)遞歸方法里還要對(duì)每個(gè)文件夾再做一次遞歸。
我們完全可以在一次遞歸中完成整個(gè)計(jì)算過程。于是,我又向大語言模型
重新提問:
你是一個(gè)卓越的Java程序員,把以下方法改寫為計(jì)算文件下所有文件夾和文件的大小的總和,要求性能最優(yōu):
很遺憾,我雖然給大語言模型
扣上了卓越的帽子,但回答仍然不理想。
只能自己動(dòng)手了,把calculateFolderSize
方法修改為:
private long calculateFolderSize(File folder, DefaultMutableTreeNode node) {
long size = 0;
Map<DefaultMutableTreeNode, Long> nodeMap = new HashMap<>();
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(file.getName());
long subSize = calculateFolderSize(file, subnode);
nodeMap.put(subnode, subSize);
size += subSize;
} else {
size += file.length();
}
}
List<Entry<DefaultMutableTreeNode, Long>> nodes = new ArrayList<>(nodeMap.entrySet());
Collections.sort(nodes, (o1,o2)-> o2.getValue().compareTo(o1.getValue()));
for (Map.Entry<DefaultMutableTreeNode, Long> entry : nodes) {
node.add(entry.getKey());
}
node.setUserObject(node.getUserObject() + " (" + humanReadableByteCount(size, false) + ")");
return size;
}
運(yùn)行一下,看看效果:
結(jié)尾
自從大語言模型
等AI技術(shù)在全球范圍內(nèi)廣泛應(yīng)用以來,許多人開始擔(dān)憂自己是否會(huì)被AI所取代。盡管AI在眾多領(lǐng)域展現(xiàn)出了驚人的能力,但要想完全替代人類,仍需克服諸多難題。
在本文中,盡管AI已經(jīng)展示出較高的技術(shù)水平,但它仍然需要我的改進(jìn)和優(yōu)化來完成我所提供的任務(wù)。AI可以被視為一種工具,協(xié)助我解決復(fù)雜問題,提高工作效率。文章來源:http://www.zghlxwxcb.cn/news/detail-440389.html
因此,真正可能替代你的并非AI本身,而是那些能夠熟練運(yùn)用AI技術(shù)的人。文章來源地址http://www.zghlxwxcb.cn/news/detail-440389.html
附:最終完整代碼
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class FolderSizeCalculator extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JButton btnSelectFolder;
private JTree tree;
private DefaultTreeModel treeModel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
try {
FolderSizeCalculator frame = new FolderSizeCalculator();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
});
}
/**
* Create the frame.
*/
public FolderSizeCalculator() {
setTitle("Folder Size Calculator");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
btnSelectFolder = new JButton("Select Folder");
btnSelectFolder.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int result = fileChooser.showOpenDialog(FolderSizeCalculator.this);
if (result == JFileChooser.APPROVE_OPTION) {
File folder = fileChooser.getSelectedFile();
DefaultMutableTreeNode root = new DefaultMutableTreeNode(folder.getName());
treeModel = new DefaultTreeModel(root);
tree.setModel(treeModel);
calculateFolderSize(folder, root);
tree.expandRow(0);
}
}
});
contentPane.add(btnSelectFolder, BorderLayout.NORTH);
JScrollPane scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
tree = new JTree();
scrollPane.setViewportView(tree);
}
private long calculateFolderSize(File folder, DefaultMutableTreeNode node) {
long size = 0;
Map<DefaultMutableTreeNode, Long> nodeMap = new HashMap<>();
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(file.getName());
long subSize = calculateFolderSize(file, subnode);
nodeMap.put(subnode, subSize);
size += subSize;
} else {
size += file.length();
}
}
List<Entry<DefaultMutableTreeNode, Long>> nodes = new ArrayList<>(nodeMap.entrySet());
nodes.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
for (Map.Entry<DefaultMutableTreeNode, Long> entry : nodes) {
node.add(entry.getKey());
}
node.setUserObject(node.getUserObject() + " (" + humanReadableByteCount(size, false) + ")");
return size;
}
private String humanReadableByteCount(long bytes, boolean si) {
int unit = si ? 1000 : 1024;
if (bytes < unit) {
return bytes + " B";
}
int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
}
}
到了這里,關(guān)于【AI幫我寫代碼,上班摸魚不是夢(mèng)】調(diào)教ChatGPT過程全記錄,讓它幫我寫程序?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!