Introduce Resource::getContentAsString
This commit introduces the getContentAsString method to Resource, returning the string contents of the resource. Closes gh-24651
This commit is contained in:
committed by
Arjen Poutsma
parent
18896aceca
commit
4da2499613
@@ -26,7 +26,10 @@ import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.jar.JarEntry;
|
||||
|
||||
@@ -320,6 +323,39 @@ public abstract class AbstractFileResolvingResource extends AbstractResource {
|
||||
protected void customizeConnection(HttpURLConnection con) throws IOException {
|
||||
}
|
||||
|
||||
/**
|
||||
* This implementation returns the contents of a file as a string using the
|
||||
* system default Charset. Provided the resource exists and the context has
|
||||
* access to it, the contents will be returned as a single string with line
|
||||
* feed characters retained.
|
||||
* @return the contents of the requested file as a {@code String}.
|
||||
* @throws FileNotFoundException in the event the file path is invalid.
|
||||
* @throws IOException if the file can not be read or cannot be serialzied.
|
||||
*/
|
||||
@Override
|
||||
public String getContentAsString() throws IOException {
|
||||
|
||||
if( !exists() ) {
|
||||
throw new FileNotFoundException(getDescription() + " cannot be found.");
|
||||
}
|
||||
if ( !isReadable() ) {
|
||||
throw new IOException(getDescription() + " cannot be opened for reading.");
|
||||
}
|
||||
return new String(Files.readAllBytes(Paths.get(getFile().getAbsolutePath())), Charset.defaultCharset());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContentAsString(Charset charset) throws IOException {
|
||||
|
||||
if( !exists() ) {
|
||||
throw new FileNotFoundException(getDescription() + " cannot be found.");
|
||||
}
|
||||
if ( !isReadable() ) {
|
||||
throw new IOException(getDescription() + " cannot be opened for reading.");
|
||||
}
|
||||
return new String(Files.readAllBytes(Paths.get(getFile().getAbsolutePath())), charset);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Inner delegate class, avoiding a hard JBoss VFS API dependency at runtime.
|
||||
|
||||
@@ -17,12 +17,14 @@
|
||||
package org.springframework.core.io;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
@@ -176,4 +178,41 @@ public interface Resource extends InputStreamSource {
|
||||
*/
|
||||
String getDescription();
|
||||
|
||||
/**
|
||||
* Return a {@link ReadableByteChannel}.
|
||||
* <p>It is expected that each call creates a <i>fresh</i> channel.
|
||||
* <p>The default implementation returns {@link Channels#newChannel(InputStream)}
|
||||
* with the result of {@link #getInputStream()}.
|
||||
* @return the byte channel for the underlying resource (must not be {@code null})
|
||||
* @throws java.io.FileNotFoundException if the underlying resource doesn't exist
|
||||
* @throws IOException if the content channel could not be opened
|
||||
* @since 5.0
|
||||
* @see #getInputStream()
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns the contents of a file as a string using the system default Charset.
|
||||
* <p>The default implementation returns a {@link Object#toString()} representation of the resource.
|
||||
* @return the contents of the requested file as a {@code String}.
|
||||
* @throws FileNotFoundException in the event the file path is invalid.
|
||||
* @throws IOException if the file can not be read or cannot be accessed.
|
||||
* @since 5.2.5
|
||||
*/
|
||||
default String getContentAsString() throws IOException{
|
||||
return toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the contents of a file as a string using the specified Charset.
|
||||
* <p>The default implementation returns a {@link Object#toString()} representation of the resource.
|
||||
* @param charset the {@code Charset} to use to deserialize the content. Defaults to system default.
|
||||
* @return the contents of the requested file as a {@code String}.
|
||||
* @throws FileNotFoundException in the event the file path is invalid.
|
||||
* @throws IOException if the file can not be read or cannot be accessed.
|
||||
* @since 5.2.5
|
||||
*/
|
||||
default String getContentAsString(Charset charset) throws IOException{
|
||||
return toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -456,4 +456,25 @@ class ResourceTests {
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
void getContentAsString_givenValidFile_ShouldReturnFileContent() throws IOException {
|
||||
String expectedString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
+ "<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">\n"
|
||||
+ "<properties version=\"1.0\">\n"
|
||||
+ "\t<entry key=\"foo\">bar</entry>\n"
|
||||
+ "</properties>";
|
||||
|
||||
String fileDirString =
|
||||
new ClassPathResource("org/springframework/core/io/example.xml").getContentAsString();
|
||||
assertThat(fileDirString).isNotBlank();
|
||||
assertThat(fileDirString).isEqualTo(expectedString);
|
||||
}
|
||||
|
||||
@Test
|
||||
void getContentAsString_givenAnInvalidFile_ShouldThrowFileNotFoundException(){
|
||||
assertThatExceptionOfType(FileNotFoundException.class)
|
||||
.isThrownBy(new ClassPathResource("nonExistantFile")::getContentAsString);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,5 +2,4 @@
|
||||
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
|
||||
<properties version="1.0">
|
||||
<entry key="foo">bar</entry>
|
||||
</properties>
|
||||
|
||||
</properties>
|
||||
Reference in New Issue
Block a user