热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

读取文件的目录结构和统计文件的代码信息

读取目录结构FileInfo.java:packagecom.data.io;importjava.io.*;***FileInfo.java*文件信息*@authorAdmi

读取目录结构 FileInfo.java:

package com.data.io;
import java.io.*;
/**
* FileInfo.java
* 文件信息
*
@author Administrator
*
*/
public class FileInfo {
/**
* 文件(目录)的大小 (字节)
*/
private long size;
private int fileSize;
private int folderSize;
private File file;

public FileInfo(File file) {
this.file = file;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public int getFileSize() {
return fileSize;
}
public void setFileSize(int fileSize) {
this.fileSize = fileSize;
}
public int getFolderSize() {
return folderSize;
}
public void setFolderSize(int folderSize) {
this.folderSize = folderSize;
}


public void print() {
System.out.printf(
"文件:%s\n", file.getAbsolutePath());
System.out.printf(
"大小: %,d\n", size);
System.out.printf(
"目录: %,d\n", folderSize);
System.out.printf(
"文件: %,d\n", fileSize);
}



}
View Code

 

读取代码信息:CodeInfo.java:

package com.data.io;

public class CodeInfo {
/**
* 总行
*/
int total;
/**
* 代码行
*/
int codeLine;
/**
* 空行
*/
int blankLine;
/**
* 注释行
*/
int commentLine;

public void print() {
System.out.printf(
"总行:%,d\n",total);
System.out.printf(
"代码行: %,d\n",codeLine);
System.out.printf(
"空行: %,d\n",blankLine);
System.out.printf(
"单注释行: %,d\n",commentLine);
}
}
View Code

 

具体实现功能的文件 Model.java:

package com.data.io;

import java.io.*;
import java.awt.*;

import javax.naming.directory.DirContext;
import javax.sound.midi.MidiDevice.Info;
import javax.swing.*;

import javafx.scene.shape.Line;
/**
* Model.java
*
@author Administrator
*
*/
public class Model {

/**
* 统计一个文件中的代码信息
*
*
@param sourceFile
*
@return
*/
public static CodeInfo getCodeInfo(File sourceFile) {
CodeInfo info
= new CodeInfo();
// 每次读取文件中的一行,这一行什么开始,(/* //),什么时候结束(*/)
try (BufferedReader in = new BufferedReader(new FileReader(sourceFile))) {
String line;
boolean flag = false;
while (null != (line = in.readLine())) {
info.total
++;

// 截断前后的空格
line = line.trim();
if (line.startsWith("/*"))
{
flag
= true;
}
if (flag) {
// 放在前面防止单行的这个注释法
info.commentLine++;
if (line.endsWith("*/")) {
flag
= false;
}
}
else {
if (line.length() == 0) {
// 空行
info.blankLine++;
}
if (line.startsWith("//")) {
info.commentLine
++;
}
}
}
info.codeLine
= info.total - info.blankLine - info.commentLine;

}
catch (Exception e) {
// TODO: handle exception
}
return info;
}
/**
*
*
@param file
* 目标文件
*
@return FileInfo 文件的统计信息
*/
public static FileInfo getFileInfo(File file) {
FileInfo info
= new FileInfo(file);

info.setSize(countSize(file));
info.setFileSize(countFileSize(file));
info.setFolderSize(countFolderSize(file));
return info;
}

private static int countFolderSize(File dir) {
int size = 0;

// 获得目录中的所有内容
File[] files = dir.listFiles();
//遍历
for(File f : files) {
if(f.isDirectory()) {
//文件夹则加一
size++;
//进入该目录,统计目录中文件夹的数量
//注意不能只写countFileSize(f),这样每层都有一个新的size
size += countFolderSize(f);
}
}
return size;
}

private static int countFileSize(File dir) {
int size = 0;

// 获得目录中的所有内容
File[] files = dir.listFiles();

for(File f : files) {
if(f.isFile()) {
//文件则加一
size++;

}
else {
//目录:进入该目录,统计目录中文件的数量
size += countFileSize(f);
}
}

return size;

}

private static long countSize(File dir) {
long size = 0;

// 获得目录中的所有内容
File[] files = dir.listFiles();

for(File f : files) {
if(f.isFile()) {
//文件
long s = f.length();
size
+= s;
}
else {
//目录
size += countSize(f);
}
}

return size;
}
}
View Code

 

运行文件App.java:

package com.data.io;

import java.io.File;
/**
* App.java
*
@author Administrator
*
*/
public class App {
public static void main(String[] args) {
// File file = new File("G:/jdk1.8.0_131");
// FileInfo info = Model.getFileInfo(file);
// info.print();

CodeInfo info
= Model.getCodeInfo(new File("code.txt"));
info.print();
}
}
View Code

 

运行结果:

 

总行:17
代码行: 7
空行: 2
单注释行: 8

 

文件:G:\jdk1.8.0_131
大小: 458,125,906
目录: 619
文件: 9,196

 

如果用Swing做个界面的话:

  用windowsbuilder做:

UI.java(运行接口)

package com.data.io;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.GridBagConstraints;
import javax.swing.JButton;
import javax.swing.JFileChooser;

import java.awt.Insets;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.io.File;
import java.awt.event.ActionEvent;

public class UI extends JFrame {

private JPanel contentPane;
private JTextField textField;
private JLabel lblNewLabel_1;

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

/**
* Create the frame.
*/
public UI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(
100, 100, 712, 554);
contentPane
= new JPanel();
contentPane.setBorder(
new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane
= new GridBagLayout();
gbl_contentPane.columnWidths
= new int[]{0, 0, 0, 0};
gbl_contentPane.rowHeights
= new int[]{0, 0, 0, 0, 0, 0};
gbl_contentPane.columnWeights
= new double[]{1.0, 1.0, 0.0, Double.MIN_VALUE};
gbl_contentPane.rowWeights
= new double[]{0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
contentPane.setLayout(gbl_contentPane);

JLabel lblNewLabel
= new JLabel("New label");
GridBagConstraints gbc_lblNewLabel
= new GridBagConstraints();
gbc_lblNewLabel.anchor
= GridBagConstraints.EAST;
gbc_lblNewLabel.insets
= new Insets(0, 0, 5, 5);
gbc_lblNewLabel.gridx
= 0;
gbc_lblNewLabel.gridy
= 0;
contentPane.add(lblNewLabel, gbc_lblNewLabel);

textField
= new JTextField();
GridBagConstraints gbc_textField
= new GridBagConstraints();
gbc_textField.insets
= new Insets(0, 0, 5, 5);
gbc_textField.fill
= GridBagConstraints.HORIZONTAL;
gbc_textField.gridx
= 1;
gbc_textField.gridy
= 0;
contentPane.add(textField, gbc_textField);
textField.setColumns(
10);

JButton btnNewButton
= new JButton("选择目录");
btnNewButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser chooser
= new JFileChooser();
// chooser.setFileFilter(filter);
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int r = chooser.showOpenDialog(UI.this);
if(r == JFileChooser.APPROVE_OPTION) {
File dir
= chooser.getSelectedFile();
FileInfo info
= Model.getFileInfo(dir);
//显示结果
textField.setText(dir.getAbsolutePath());
lblNewLabel.setText(String.format(
"大小:%,d", info.getSize()));
}
}
});
GridBagConstraints gbc_btnNewButton
= new GridBagConstraints();
gbc_btnNewButton.insets
= new Insets(0, 0, 5, 0);
gbc_btnNewButton.gridx
= 2;
gbc_btnNewButton.gridy
= 0;
contentPane.add(btnNewButton, gbc_btnNewButton);

lblNewLabel_1
= new JLabel("New label");
GridBagConstraints gbc_lblNewLabel_1
= new GridBagConstraints();
gbc_lblNewLabel_1.insets
= new Insets(0, 0, 5, 5);
gbc_lblNewLabel_1.gridx
= 0;
gbc_lblNewLabel_1.gridy
= 1;
contentPane.add(lblNewLabel_1, gbc_lblNewLabel_1);

JLabel lblNewLabel_2
= new JLabel("New label");
GridBagConstraints gbc_lblNewLabel_2
= new GridBagConstraints();
gbc_lblNewLabel_2.insets
= new Insets(0, 0, 5, 5);
gbc_lblNewLabel_2.gridx
= 0;
gbc_lblNewLabel_2.gridy
= 2;
contentPane.add(lblNewLabel_2, gbc_lblNewLabel_2);

JLabel lblNewLabel_3
= new JLabel("New label");
GridBagConstraints gbc_lblNewLabel_3
= new GridBagConstraints();
gbc_lblNewLabel_3.insets
= new Insets(0, 0, 5, 5);
gbc_lblNewLabel_3.gridx
= 0;
gbc_lblNewLabel_3.gridy
= 3;
contentPane.add(lblNewLabel_3, gbc_lblNewLabel_3);

// JPanel panel = new JPanel();
PieView pie = new PieView();
// panel.add(pie);

GridBagConstraints gbc_panel
= new GridBagConstraints();
gbc_panel.gridwidth
= 3;
gbc_panel.fill
= GridBagConstraints.BOTH;
gbc_panel.gridx
= 0;
gbc_panel.gridy
= 4;
contentPane.add(pie, gbc_panel);
}

}
View Code

PieView.java:

package com.data.io;

import java.awt.Graphics;

import javax.swing.JPanel;

import com.sun.prism.paint.Color;

public class PieView extends JPanel{

// double[] data;
//
// Color[] colors = {Color.BLUE,}
@Override
public void paint(Graphics g) {

super.paint(g);
//获得panel的宽,高
int w = getWidth();
int h = getHeight();
int x = w/2;
int y = h/2;
int r = w w : h ;
// g.fillOval(0, 0, w, h);
g.fillOval(x- r/2, y- r/2, r, r);
// g.fillRect(w- r/2, h- r/2, r, r);


}
}
View Code

结果:

 


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
author-avatar
丰日2012_102
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有