java中的文件结构
您好,我是Java新手,所以我想了解一些关于如何用Java组织项目文件的指南。目前,我正在使用GUI构建一个应用程序,因此我需要两个文件,一个与GUI相关,另一个与从第一个GUI调用的任何函数相关。现在,我将第二个文件命名为Utilities.java,如下所示:java中的文件结构,java,Java,您好,我是Java新手,所以我想了解一些关于如何用Java组织项目文件的指南。目前,我正在使用GUI构建一个应用程序,因此我需要两个文件,一个与GUI相关,另一个与从第一个GUI调用的任何函数相关。现在,我将第二个文件命名为Utilities.java,如下所示: package Directory; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; impo
package Directory;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.swing.JProgressBar;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
public class Utilities {
public class FileCopy{
private File Source;
private File Destination;
private long totalBytes=0L;
FileCopy(File source,File destination){
Source=source;
Destination=destination;
retrieveTotalBytes(source);
}
File getSource(){return Source;}
File getDestination(){return Destination;}
Long gettotalBytes(){return totalBytes;}
private void retrieveTotalBytes(File sourceFile)
{
if(sourceFile.isDirectory()==false){
totalBytes = sourceFile.length();
}
else{
File[] files = sourceFile.listFiles();
for(File file : files)
{
if(file.isDirectory()) retrieveTotalBytes(file);
else totalBytes += file.length();
}
}
System.out.print("Done retrieving");
}
}
public class Copy extends SwingWorker<Void,Integer>
{
File src,dest;
InputStream in;
OutputStream out;
JProgressBar progressBar;
JProgressBar all;
JTextArea txt;
public int progress;
//private int all_progress;
private long totalBytes = 0L;
private long copiedBytes = 0L;
boolean keepStructure=false;
boolean delete=false;
public Copy(File source,File dst,JProgressBar br,JTextArea text,boolean keep,boolean delete)
{
src=source;
dest=dst;
progressBar=br;
txt=text;
progressBar.setValue(0);
progressBar.setVisible(true);
txt.setText("Copying " + src.getName());
keepStructure=keep;
this.delete=delete;
}
@Override
public Void doInBackground() throws Exception
{
txt.setText(src.getName());
//retrieveTotalBytes(src);
copyFiles(src, dest);
return null;
}
@Override
public void process(java.util.List<Integer> chunks)
{
for(int i : chunks)
{
progressBar.setValue(i);
}
}
@Override
public void done()
{
setProgress(100);
}
public String GetParent(String input){
short pos=(short) input.lastIndexOf(File.separatorChar);
return input.substring(0, pos);
}
private void copyFiles(File sourceFile, File targetFile) throws IOException
{
if(sourceFile.isDirectory())
{
if(!targetFile.exists()) targetFile.mkdirs();
String[] filePaths = sourceFile.list();
for(String filePath : filePaths)
{
File destFile;
File srcFile = new File(sourceFile, filePath);
if(keepStructure==true)
destFile= new File(targetFile, filePath);
else{
String filepath2=GetParent(dest.toString())+File.separatorChar+srcFile.getName();
destFile=new File(filepath2);
}
System.out.print("\n\n name="+destFile.toString()+"\n");
System.out.print("dest to string =" +GetParent(dest.toString()) + " srcFile.getName()="+srcFile.getName()+"\n" );
copyFiles(srcFile, destFile);
}
}
else
{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile));
long fileBytes = sourceFile.length();
long soFar = 0L;
int theByte;
while((theByte = bis.read()) != -1)
{
bos.write(theByte);
setProgress((int) (copiedBytes++ * 100 / totalBytes));
publish((int) (soFar++ * 100 / fileBytes));
}
bis.close();
bos.close();
if(delete==true)
sourceFile.delete();
publish(100);
txt.setText("Copying " + src.getName() + "complete");
}
}
}
}
我收到这个错误:
无法访问类型为Utilities的封闭实例。必须符合条件
带有类型为Utilities(例如。
x、 新的A(),其中x是实用程序的实例)
在Java中,您应该(至少在您还在学习基础知识的时候)将每个类保存在自己的文件中。 您的文件中有3个(而不是2个)类:
Utilities
、FileCopy
和Copy
,后两个类是Utilities
的内部类(Utilities
类本身不做任何事情)。这就是为什么在没有先实例化实用程序的情况下,不能实例化复制
我认为您应该有一个名为实用程序
的包,其中包含两个文件:FileCopy.java
和Copy.java
,每个文件都包含自己的类。如果您想要一种方法来区分应用程序的各个部分,那么这是一个很好的开始:有一个包含所有gui相关类的包,另一个包用于应用程序的其余部分
这将解决您的错误
关于嵌套类的官方教程:将它们全部放在单独的.java文件中,很可能您的问题就解决了。当您进一步了解Java时,您将了解有关内部(非静态)类的详细信息。现在开始,您应该遵循Java命名约定。@petermm您能为我提供有关命名约定的任何好链接吗?提前谢谢!下面是一个关于Java命名约定的维基百科示例。我仍在尝试从Oracle的网站上获取一些官方约定,但还找不到。重要的命名约定:包名称完全是小写的(package directory
),字段名和方法名以小写开头,但每一个单词都大写:getTotalBytes
,私有文件目的地代码>。(下划线不用于分隔单词)类名以大写字母开头,并将下一个单词大写。
Copy worker = new Copy(source,dest,progressBar,textArea, keep_Structure,false);