Java 对于采用文件名的方法,使用字符串或文件作为参数类型,哪个更好

Java 对于采用文件名的方法,使用字符串或文件作为参数类型,哪个更好,java,file-io,Java,File Io,我有两个方法以文件名为参数。我的疑问是,有什么更好的方法来声明这些方法的参数呢 参数的类型是否应为String void normalizeData(String inFile) 或者我应该显式地将参数声明为File void normalizeData(File inFile) 就我个人而言,我觉得文件更直观,但我想知道这类事情的最佳实践是什么 如果传递字符串,则可以在方法中控制文件的打开方式和文件句柄的管理方式。您正在集中化该代码。如果传递文件对象,则在调用该对象的任何地方都复制

我有两个方法以文件名为参数。我的疑问是,有什么更好的方法来声明这些方法的参数呢

  • 参数的类型是否应为
    String

    void normalizeData(String inFile)
    
  • 或者我应该显式地将参数声明为
    File

    void normalizeData(File inFile)
    

就我个人而言,我觉得
文件
更直观,但我想知道这类事情的最佳实践是什么

如果传递字符串,则可以在方法中控制文件的打开方式和文件句柄的管理方式。您正在集中化该代码。如果传递
文件
对象,则在调用该对象的任何地方都复制文件处理代码。因此,我对前者有强烈的偏好。

这取决于您希望文件hanlde位于normalizeData方法之外还是仅在其内部。如果要在调用normalizeData方法之前或之后对文件执行某些操作,请在normalizeData方法之外创建一个file对象,并将引用传递给该方法。如果只有normalizeData方法需要处理file对象,那么只需将文件名传递给它即可

取决于您的需要以及您希望如何处理您的文件。

我会通过一个-这使代码更易于测试,并且不会将其绑定到文件系统

这样,您的代码将以如下方式结束:

public void normalizeData(InputStream in)
{
  ...
}
并称之为:

myObject.normalizeData(new FileInputStream(myFile));

或者在测试中

myObject.normalizeData(new ByteArrayInputStream("some test data".getBytes()));

考虑使用多个重载方法为API用户提供选择权


还可以考虑传递一个
InputStream
,因为API的用户可能希望使用任何内存中的数据表示。

设计取决于许多参数,例如,谁将使用此方法。它是否将被重载,是内部、包级别还是公共API。我倾向于一般性地提供两种重载方法:

  • 路径中传递的文件,这是指定文件路径的常用方法
  • 以及在
    输入流
    中传递的,即字节输入流的一般表示

    public void normalizeData(Path filePath)//Path是指定文件路径的常用方法

    public void normalizeData(InputStream)//字节输入流的一般表示


但正如我所说,这取决于您的项目规格。

这将是个人品味的问题。在我看来,最好使用
File
作为参数,但在
String
实现中,您可以执行
File File=new File(infle);规范化数据(文件)并且没有问题:)。首选使用
文件
,因为它对预期输入毫无疑问<代码>字符串
可能变得模棱两可。如果您希望允许开发人员传递一个
字符串
值,以便在将来的某个阶段进行标准化(即他们自己已经加载了值),该怎么办?两者都要。可能重复的“我已投票”以“非建设性”结束。对于这一点,没有一个正确的答案,许多争论将接踵而至。如果你通过字符串,您可以控制该方法如何打开文件。您可以解释如何打开文件吗?您如何确定
字符串
是否为文件而不是用户要处理的数据?+1它还允许引用jar/zip中的文件。+1停止改进答案,我只能对其进行一次投票:P@MadProgrammer我仍然可以投票。。。等等,现在我不能了。谢谢@MadProgrammer来自我和所有想再次投票的选民,+1。
myObject.normalizeData(new ByteArrayInputStream("some test data".getBytes()));