Я использовал этот код ниже в своих проектах. По сути, я сканирую весь путь к классам для поиска файла, если у меня нет точного пути. Это поможет мне убедиться, что мне не нужно указывать файл по определенному пути.
Это потому, что я столкнулся с той же ошибкой, что и вы, когда я использовал эту строку.
getClass().getClassLoader().getResource("Brochure.pdf")
Итак, я создал две функции, которые принимают имя файла и пути к классам, включенные в jar, и рекурсивно искали файл.
private static File findConfigFile(String paths, String configFilename) {
for (String p : paths.split(File.pathSeparator)) {
File result = findConfigFile(new File(p), configFilename);
if (result != null) {
return result;
}
}
return null;
}
private static File findConfigFile(File path, String configFilename) {
if (path.isDirectory()) {
String[] subPaths = path.list();
if (subPaths == null) {
return null;
}
for (String sp : subPaths) {
File subPath = new File(path.getAbsoluteFile() + "/" + sp);
File result = findConfigFile(subPath, configFilename);
if (result != null && result.getName().equalsIgnoreCase(configFilename)) {
return result;
}
}
return null;
} else {
File file = path;
if (file.getName().equalsIgnoreCase(configFilename)) {
return file;
}
return null;
}
}
Вот пример моего кода в действии:
import java.io.File;
public class FindResourcesRecursive {
public File findConfigFile(String paths, String configFilename) {
for (String p : paths.split(File.pathSeparator)) {
File result = findConfigFile(new File(p), configFilename);
if (result != null) {
return result;
}
}
return null;
}
private File findConfigFile(File path, String configFilename) {
if (path.isDirectory()) {
String[] subPaths = path.list();
if (subPaths == null) {
return null;
}
for (String sp : subPaths) {
File subPath = new File(path.getAbsoluteFile() + "/" + sp);
File result = findConfigFile(subPath, configFilename);
if (result != null && result.getName().equalsIgnoreCase(configFilename)) {
return result;
}
}
return null;
} else {
File file = path;
if (file.getName().equalsIgnoreCase(configFilename)) {
return file;
}
return null;
}
}
}
Здесь у меня есть тестовый пример, который связан с файлом «test.txt» в моей папке test / resources. Содержимое указанного файла:
A sample file
Теперь вот мой тестовый пример:
import org.junit.Test;
import java.io.*;
import static org.junit.Assert.fail;
public class FindResourcesRecursiveTest {
@Test
public void testFindFile() {
// Here in the test resources I have a file "test.txt"
// Inside it is a string "A sample file"
// My Unit Test will use the class FindResourcesRecursive to find the file and print out the results.
File testFile = new FindResourcesRecursive().findConfigFile(
System.getProperty("java.class.path"),
"test.txt"
);
try (FileInputStream is = new FileInputStream(testFile)) {
int i;
while ((i = is.read()) != -1) {
System.out.print((char) i);
}
System.out.println();
} catch (IOException e) {
fail();
}
}
}
Теперь, если вы запустите этот тест, он напечатает «Пример файла» и тест будет зеленым.
Теперь, с тобой все в порядке?
Это кажется мне достаточно хорошей идеей, что я был бы удивлен, не существует ли что-то как он уже. С другой стороны, так как можно скомпилировать C++ непосредственно, (взгляд на то, что .mm расширение дает Вам), это могло бы быть несколько тривиально.
Я не думаю, что это необходимо. С Objective C ++, Вам не нужен мост вообще. Учитывая определенный класс C++
class Foo {
public:
void someMethod(void);
}
можно использовать тот класс где угодно в Objective C ++ код. Например, в рамках метода:
- (void)myObjCMethod {
Foo myFoo;
myFoo.someMethod();
//etc.
}
У Вас могут быть переменные экземпляра, которые указывают на классы C++, таким образом, Вы могли определить класс Objective C как
@interface Bar : NSObject {
Foo *foo;
}
@property (assign) Foo * foo;
@end
@implementation
@synthesize foo;
- (void)dalloc {
delete foo;
[super dealloc];
}
- (id)init {
if(self = [super init]) {
foo = new Foo();
}
return self;
}
- (void)aMethod {
self.foo->barMethod();
}
Я не думаю, что можно обработать метод Objective C по шаблону, но шаблонные инстанцирования C++ в Objective C ++ являются справедливой игрой. Так же, как Objective C является строгим надмножеством C, Objective C ++ является надмножеством C++, добавляя классы Стиля Objective C и передачу сообщений.
Если Вы действительно хотели "соединить класс C++ мостом", Вы собираетесь испытать затруднения в целом, так как вещи как множественное наследование и перегрузка оператора не поддерживаются в объектной модели Objective C.