私のプロジェクトは次のような構造をしています。
/src/main/Java/
/src/main/resources/
/src/test/Java/
/src/test/resources/
/src/test/resources/test.csv
にファイルがあり、/src/test/Java/MyTest.Java
のユニットテストからファイルをロードしたい
私はうまくいかなかったこのコードを持っています。 「そのようなファイルやディレクトリはありません」と文句を言う。
BufferedReader br = new BufferedReader (new FileReader(test.csv))
私もこれを試しました
InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv))
これもうまくいきません。 null
を返します。私は自分のプロジェクトを構築するためにMavenを使っています。
次を試してください。
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("test.csv");
上記の方法でうまくいかない場合は、さまざまなプロジェクトに次のクラスが追加されています。 ClassLoaderUtil
1 (コード ここ )。2
そのクラスの使用方法の例をいくつか示します。
src\main\Java\com\company\test\YourCallingClass.Java src\main\Java\com\opensymphony\xwork2\util\ClassLoaderUtil.Java src\main\resources\test csv
// Java.net.URL
URL url = ClassLoaderUtil.getResource("test.csv", YourCallingClass.class);
Path path = Paths.get(url.toURI());
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
// Java.io.InputStream
InputStream inputStream = ClassLoaderUtil.getResourceAsStream("test.csv", YourCallingClass.class);
InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
for (String line; (line = reader.readLine()) != null;) {
// Process line
}
ノート
試してください:
InputStream is = MyTest.class.getResourceAsStream("/test.csv");
デフォルトでは、IIRC getResourceAsStream()
はクラスのパッケージからの相対パスです。
これは Guava を使った簡単な解決策です。
import com.google.common.base.Charsets;
import com.google.common.io.Resources;
public String readResource(final String fileName, Charset charset) throws IOException {
return Resources.toString(Resources.getResource(fileName), charset);
}
使用法:
String fixture = this.readResource("filename.txt", Charsets.UTF_8)
SpringプロジェクトでFlowingコードを試す
ClassPathResource resource = new ClassPathResource("fileName");
InputStream inputStream = resource.getInputStream();
または春以外のプロジェクトで
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("fileName").getFile());
InputStream inputStream = new FileInputStream(file);
今、私はmavenが作成したリソースディレクトリからフォントを読むためのソースコードを説明しています、
scr/main/resources/calibril.ttf
Font getCalibriLightFont(int fontSize){
Font font = null;
try{
URL fontURL = OneMethod.class.getResource("/calibril.ttf");
InputStream fontStream = fontURL.openStream();
font = new Font(Font.createFont(Font.TRUETYPE_FONT, fontStream).getFamily(), Font.PLAIN, fontSize);
fontStream.close();
}catch(IOException | FontFormatException ief){
font = new Font("Arial", Font.PLAIN, fontSize);
ief.printStackTrace();
}
return font;
}
それは私のために働いたし、全体のソースコードもあなたを助けることを願っています、お楽しみください!
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("test.csv");
コンテキストClassLoaderを使用してリソースを見つけると、間違いなくアプリケーションのパフォーマンスが低下します。
以下をインポートしてください。
import Java.io.IOException;
import Java.io.FileNotFoundException;
import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import Java.io.InputStream;
import Java.util.ArrayList;
次のメソッドは、StringのArrayListにファイルを返します。
public ArrayList<String> loadFile(String filename){
ArrayList<String> lines = new ArrayList<String>();
try{
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classloader.getResourceAsStream(filename);
InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
for (String line; (line = reader.readLine()) != null;) {
lines.add(line);
}
}catch(FileNotFoundException fnfe){
// process errors
}catch(IOException ioe){
// process errors
}
return lines;
}
IDEから実行する場合など、Mavenビルドのjarを実行しない場合でもコードは機能しますか?そうであれば、ファイルが実際にjarファイルに含まれていることを確認してください。 resourcesフォルダーはpomファイルの<build><resources>
に含まれているはずです。
次のクラスはresource
からclasspath
をロードするために使用することができます、そしてまた、与えられたfilePath
に問題がある場合には適切なエラーメッセージを受け取ります。
import Java.io.InputStream;
import Java.nio.file.NoSuchFileException;
public class ResourceLoader
{
private String filePath;
public ResourceLoader(String filePath)
{
this.filePath = filePath;
if(filePath.startsWith("/"))
{
throw new IllegalArgumentException("Relative paths may not have a leading slash!");
}
}
public InputStream getResource() throws NoSuchFileException
{
ClassLoader classLoader = this.getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(filePath);
if(inputStream == null)
{
throw new NoSuchFileException("Resource file not found. Note that the current directory is the source folder!");
}
return inputStream;
}
}
getResource()はsrc/main/resources
だけに置かれたリソースファイルでうまく働いていました。 src/main/resources
以外のパスにあるファイルを取得するには、src/test/Java
と言います。
次の例は役に立つかもしれません
import Java.io.BufferedReader;
import Java.io.FileReader;
import Java.io.IOException;
import Java.net.URISyntaxException;
import Java.net.URL;
public class Main {
public static void main(String[] args) throws URISyntaxException, IOException {
URL location = Main.class.getProtectionDomain().getCodeSource().getLocation();
BufferedReader br = new BufferedReader(new FileReader(location.getPath().toString().replace("/target/classes/", "/src/test/Java/youfilename.txt")));
}
}
私は同じ問題に直面しました /src/main/resources /からファイルを読みます -
maven 問題の原因となった https://stackoverflow.com/a/55409569/4587961
mvn clean install
そのため、resourcesフォルダに追加したファイルはMavenビルドに入り、アプリケーションで利用できるようになります。
私は私の答えを保ちたいと思います:それはファイルを読む方法を説明しません(他の答えはそれを説明します)、それは なぜ InputStream
またはresource
は null と答えます。
次のように書くことで、jarの実行とIDEの両方で動作するようになりました。
InputStream schemaStream = ProductUtil.class.getClassLoader().getResourceAsStream(jsonSchemaPath);
byte[] buffer = new byte[schemaStream.available()];
schemaStream.read(buffer);
File tempFile = File.createTempFile("com/package/schema/testSchema", "json");
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
out.write(buffer);